【问题标题】:Defining a user verification interface with optional credentials使用可选凭据定义用户验证界面
【发布时间】:2014-01-15 16:03:53
【问题描述】:

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

为了灵活,我新建了一个界面:

interface SignOnProcessor { 
  boolean verifyLogin(SignOnCredentials _credentials)
}

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

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

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

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

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

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

SingleSignOnCredentialsverifyLogin() 方法中没有做任何事情。

我觉得一定有更好的方法。我不需要创建对象并将其传递给verifyLogin(),然后不使用它。 我能想到的另一个解决方案是创建一个不带任何参数的接口方法verifyLogin()。这也感觉不对。

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

【问题讨论】:

    标签: java oop interface


    【解决方案1】:

    我看到另一个问题。举个例子:

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

    因为这是可能的,所以您必须在实现中对凭据对象进行类型检查。您要做的是概括两种实际上具有不同参数的方法。即使您将参数包装在一个对象中并泛化该对象,也是如此。

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

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

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

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

    【讨论】:

      【解决方案2】:

      为什么需要“灵活”? 仅仅为了它而创建花哨的界面并不是一个好主意。尝试以最简单的方式解决您的问题,然后看看效果如何。

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

      【讨论】:

        猜你喜欢
        • 2017-02-13
        • 2013-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多