我正在开发一个供客户使用的库的API。
库应提供单一界面来访问多个远程资源。所以,我应该创建API及其几个实现(对应于远程资源的数量)。
我遇到了下一个问题:所有资源除了一个都有用于登录的API。因此,我可以创建方法
void authenticate (String login, String password) throws AuthenticationException;
但我无法使用此方法将身份验证传递给该资源。
要在该资源上传递身份验证,我需要执行一些操作并接收用于身份验证的URL,然后我应该将此URL提供给调用者,调用者程序使用一些魔法来传递身份验证,之后它应该给我回复“流”。
所以现在我需要另外两种方法来实现必要的结果:
String getAuthenticationURL () throws AuthenticationException;
void postAuthentication () throws AuthenticationException;
如果我将这些方法添加到API中,那么我将不得不在“普通”资源的所有API实现中创建它们的空实现(或者抛出RuntimeException的实现)。
如果我不将它们添加到API中,只将它们添加到一个具体的实现中,那么我将打破统一API的整个想法。
使用这两种方法的方法只是至少几种可能解决方案中的一种。所以,欢迎任何意见和建议。
答案 0 :(得分:2)
您可以拥有一个带有两个具体子类的抽象基类 - 每个子类包含不同的身份验证机制。
另一种(可能更好)方法可能是创建一个带有两个API的抽象“身份验证”对象(两个具体实现)。一个人会有你的认证方法,另一个会有你的获取/发布。
这里的优点是你的身份验证类包含了特定于身份验证的所有功能。甚至可能在类中有一些代码是两个身份验证对象的抽象父代。
如果您愿意,您仍然可以保留您的身份验证方法,它的实现只会被委托给身份验证对象。
请注意,这也为您的用户提供了更“最小”的api,而扩展原始界面则为您提供了完整的第二个副本。粘贴类要考虑。
另外,请考虑将正确构造的身份验证对象传递给原始类的构造函数。做一个漂亮,干净的系统。
每当我将一段功能分解为它自己的类时,我总能获得一些很好的重构可能性。
答案 1 :(得分:1)
我喜欢Bill K解决方案,但您也可以让您的身份验证类像某种工厂一样工作,在身份验证完成后为您提供登录资源。
这样,用户的第一步就是选择正确的身份验证方法,进行身份验证并使其资源可供使用。