java - 设计决策 : extending an interface vs. 新界面

标签 java

你好,

我今天有一个小小的设计决定:有一个名为“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/

相关文章:

java - 如果用户输入随机字母,如何给出对话框错误 JOptionPane

java - 在 Switch-Case-Smell 上重构或使用设计模式

java - 你会如何测试谷歌地图?

java - 计算组合和阶乘的递归函数

java - 反过来使用 Activity 之间的 Intent - Android

java - Eclipse 中的 LTE-CIVIL UnsatisfiedLinkError

java - 如何用java在cucumber中传递 boolean 参数?

java - 无法使用带有 % 或 * 的 LIKE 搜索 MS Access 数据库

java - 如何从 SQLite 数据库中获取特定月份的数据

java - 我很难弄清楚如何覆盖父类(super class)中的部分 "toString"方法(多态性)