2014-01-15 20 views
0

在我的应用程序中,应该有两种登录方式:通过用户/密码手动或自动从操作系统(连接到活动目录服务器)检索凭据。使用可选凭据来定义用户验证界面

为了是柔性的,我已创建一个新的接口:

interface SignOnProcessor { 
    boolean verifyLogin(SignOnCredentials _credentials) 
} 

其中SignOnCredentials是没有任何方法的接口。

之后,我创建了两个实现SignOnProcessorPasswordSignOnProcessorSingleSignOnProcessor。两者都在其verifyLogin()方法中实现不同的逻辑。

PasswordSignOnProcessor需要用户名和密码,因此PasswordSignOnCredentials是这样实现的:

class PasswordSignOnCredentials implements SignOnCredentials { 
    String getUserName(); 
    String getPassword(); 
} 

SingleSignOnProcessor,在另一方面,不需要任何凭证。它只会向操作系统询问必要的信息。所以我目前正在传递一个空实现SignOnCredentials的:

class SingleSignOnCredentials implements SignOnCredentials { 
    // Nothing here, credentials are retrieved from OS 
} 

没有在verifyLogin()方法与SingleSignOnCredentials完成。

我有这样的感觉,必须有更好的方法。我不应该创建并传递一个对象到verifyLogin()然后不使用它。 我能想到的另一个解决方案是创建一个没有任何参数的接口方法verifyLogin()。这也感觉不对。

这种情况下的首选解决方案是什么?应该有一些很好的,干净的方式来做到这一点,但目前我被卡住了。任何帮助表示赞赏!

回答

0

我看到另一个问题。以此示例为例:

SignOnProcessor sop = new PasswordSignOnCredentials(); 
sop.verifyLogin(new SingleSignOnCredentials()); 

因为这是可能的,所以您必须在实施中检查凭证对象。你想要做的是概括两个实际上有不同参数的方法。即使你将参数包含在一个对象中,也可以概括该对象,情况就是这样。

因为我不知道你的调用代码,我假设你总是知道哪个实现被调用(意味着你不依赖于一些动态绑定魔法)。在这种情况下,我有两种可能的解决方案:

在我看来,正确的做法是创建两个操作。在这种情况下,您将有一个可以同时执行这两个操作的SignOnProcessor实现。也许你可以用不同的名字命名它们。

如果您的所有(未来)实现都需要相同的参数或根本不需要,另一种方法将适用。我认为在某些实现中不使用参数是可以的。如果您使用SSO,则可以将null作为实际参数。

尽管这两个选项对我来说都不完美,但我不认为这是强制性的坏风格(取决于您的调用代码)。但我想听听其他答案:-)

0

为什么你需要“灵活”? 仅仅为了创建奇特的接口不是一个好主意。试着用最简单的方式解决你的问题,并看看它是如何发展的。

很难提出任何建议,因为您没有指定您的应用程序如何实际选择要调用的方法,正如AndréStannek已经指出的那样。