在我的应用程序中,应该有两种登录方式:通过用户/密码手动或自动,从操作系统检索凭据(连接到活动目录服务器)。
为了灵活,我创建了一个新界面:
interface SignOnProcessor {
boolean verifyLogin(SignOnCredentials _credentials)
}
其中SignOnCredentials
是没有任何方法的接口。
之后,我创建了SignOnProcessor
的两个实现:PasswordSignOnProcessor
和SingleSignOnProcessor
。两者都在verifyLogin()
方法中实现不同的逻辑。
PasswordSignOnProcessor
需要用户名和密码,因此PasswordSignOnCredentials
的实现方式如下:
class PasswordSignOnCredentials implements SignOnCredentials {
String getUserName();
String getPassword();
}
另一方面,SingleSignOnProcessor
不需要任何凭据。它只会向操作系统询问必要的信息。因此,我目前正在传递SignOnCredentials
的空实现:
class SingleSignOnCredentials implements SignOnCredentials {
// Nothing here, credentials are retrieved from OS
}
SingleSignOnCredentials
方法中verifyLogin()
没有做任何事情。
我觉得必须有一个更好的方式。我不需要创建对象并将其传递给verifyLogin()
然后不使用它。
我能想到的另一个解决方案是创建一个没有任何参数的接口方法verifyLogin()
。这也感觉不对。
在这种情况下,首选解决方案是什么?应该有一些漂亮,干净的方式,但目前我被卡住了。任何帮助表示赞赏!
答案 0 :(得分:0)
我看到另一个问题。举个例子:
SignOnProcessor sop = new PasswordSignOnCredentials();
sop.verifyLogin(new SingleSignOnCredentials());
因为这是可能的,所以你必须在实现中检查凭证对象。你想要做的是概括两个实际上有不同参数的方法。即使你将参数包装在一个对象中也是一般化该对象,情况也是如此。
由于我不知道你的调用代码,我假设你总是知道调用哪个实现(意味着你不依赖于某些动态绑定魔法)。在这种情况下,我有两种可能的解决方案:
在我看来,正确的方法是创建两个操作。在这种情况下,您可以使用SignOnProcessor
的单个实现来执行这两项操作。也许你也可以用不同的名字命名。
如果所有(未来)实现都需要相同的参数或根本不需要,那么另一种方法将适用。我认为在某些实现中不使用参数是可以的。如果您使用SSO,则可以将null
作为实际参数传递。
这两种选择对我来说都不是很完美,但我不认为它是强制性的坏风格(取决于你的调用代码)。但我想听听其他一些答案: - )
答案 1 :(得分:0)
为什么你需要“灵活”? 仅仅为了它创建花哨的界面不是一个好主意。尝试以最简单的方式解决您的问题,看看它是如何进行的。
很难提出任何建议,因为你没有说明你的应用程序如何实际选择调用哪种方法,正如AndréStannek已经指出的那样。