使用模块化的Java接口的正确用法是什么?

时间:2012-04-17 11:26:27

标签: java inheritance interface module

我正在尝试模拟遗留代码,这样做我遇到了这个问题:

我有两个属于同一个模块的类 - 以及许多其他类 - 每个类都有一个或多个公共方法用于其他地方。我想为模块创建一个通用接口,但我不知道该怎么做。如果我为模块创建一个接口,我将最终必须在使用该接口的所有类中实现空白方法,这听起来不太好。但是,如果我创建了多个可以由模块中的特定类使用的接口,我将它们组合在一起,只用于类型引用的一个接口:

/-------------\     /-------------\
| Interface A |     | Interface B |
\-------------/     \-------------/
/-------------\     /-------------\
|   Class A   |     |   Class B   |
\-------------/     \-------------/

/-------------\     /-------------\
| Interface A |     | Interface B |
\-------------/     \-------------/
            ^         ^
            |         |
        /------------------\
        | Module Interface |
        \------------------/

是否有任何设计模式可以帮助我解决这个问题,或者是将构成特定模块的接口组合到子接口中以表示模块类型的正确方法来实现这一目标?

2 个答案:

答案 0 :(得分:3)

我不确定我是否真的了解您的问题,但您可以通过继承将接口组合到一个界面中。那就是接口支持多重继承。

可能适用于您的模式是适配器模式:http://en.wikipedia.org/wiki/Adapter_pattern

也尽量不要为了制作它们而制作接口。 Java有这么长的历史,试图为那些永远不会有其他实现的东西创建接口。除非你制作API考虑KISS。

答案 1 :(得分:1)

如果您创建了一个公共接口,该接口的用户将希望其所有方法都能正常工作(除非文档中明确说明了如何使用)。

如果您最终必须在界面级别上指定有关如何使用它的复杂规则,以便两个模块都能正常运行,那么创建自定义界面的情况不是最好的主意。< / p>

但是,如果两个模块中只有少数方法与另一个模块不同,并且差异在调用时不会破坏模块,则可以创建自定义接口,然后提供每个模块接口的默认抽象实现,从中得出实际模块。抽象实现可以为公共接口中的所有方法定义默认(例如,无操作)实现,因此具体模块类不必专门实现它们

interface AIface {
  void methodA();
}

interface BIface {
  void methodB();
}

interface CommonIface extends AIface, BIface {
}

abstract class CommonAbstract implements CommonIface {
  @Override
  void methodA() {}
  @Override
  void methodB() {}
}

class ModuleA extends CommonAbstract {
  @Override
  void methodA() {
    // A's implementation
  }
}

class ModuleB extends CommonAbstract {
  @Override
  void methodB() {
    // B's implementation
  }
}