你好,
我今天有一个小小的设计决定:有一个名为“TargetSystem”的现有接口(interface),它只有一个方法“getName()”。没有关于这些目标系统的其他公共(public)信息。 现在我有一种需要身份验证的新型目标系统。
我必须知道目标系统是否需要身份验证(前端必须为这些系统显示密码对话框)。如果需要身份验证,我必须设置用户名和密码。
我的设计决策:我应该使用方法“needsAuthentication”和“setUsernameAndPassword”扩展现有接口(interface),还是创建一个仅使用方法“setUsernameAndPassword”扩展旧接口(interface)的新接口(interface),通过instanceof获取身份验证需求。
重要提示:没有必要向下兼容或任何其他理由不碰旧界面!我刚刚与一位同事讨论,哪种方式通常更好:创建具有“ObjectWithFeatureX”、“ObjectWithFeatureY”等名称的接口(interface)或创建“hasFeatureX”、“hasFeatureY”等方法。
最佳答案
我不太同意彼得的观点。有时,instanceof 甚至可以在设计中发挥核心作用。
就我个人而言,我喜欢以下图案(防火服:“on”):
interface Authentifiable {
void authentify(...)
}
interface Stateful {
void saveState(...)
void loadState(...)
}
interface MyOtherAspect {
...
}
然后,在代码中:
void someCode()
{
for (Server s : servers)
{
if (s instanceof Authentifiable)
((Authentifiable) s).authentify(...)
if (s instanceof Stateful)
((Stateful) s).load(...)
...
}
for (GridSystem gs : grids)
{
if (gs instanceof Authentifiable)
((Authentifiable) gs).authentify(...)
if (gs instanceof Stateful)
((Stateful) gs).load(...)
...
}
}
这使您能够在任何对象上使用完全正交的“方面”。您可以让对象实现功能 A 和 B、其他 B 和 C 以及其他 A 和 C...或任何功能的任意组合。 如果您有很多这样的功能,这会特别方便。为所有这些功能创建一个大接口(interface),其中实现对象仅使用空 stub 处理所有这些功能可能会很丑陋。
另外,在这里,您可以检查特定对象是否具有可以直接使用的特定特征,例如将对象列表分成两束,一组具有特征 X,另一组没有特征,以便进行处理他们不同。
系统中运行这些功能的部分只需要通过instanceof检查来检查对象是否具有属性A、B或C。这是可扩展的、向后兼容的并且简单。
也就是说,这是一种非常具体的处理方式,不一定适合通用目的。如果您有许多正交特征应用于多个不同的对象,那么它特别适合。
关于java - 设计决策 : extending an interface vs. 新界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4931202/