1

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

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

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

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

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

4

2 回答 2

3

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

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

也尽量不要为了制作接口而制作接口。Java 在尝试为永远不会有其他实现的东西创建接口方面有着悠久的历史。除非您制作 API 考虑 KISS。

于 2012-04-17T11:35:48.867 回答
1

如果您创建一个通用接口,该接口的用户将期望它的所有方法都可以工作(除非在文档中明确说明如何使用)。

如果您最终不得不在接口级别上指定如何使用它的复杂规则,以便两个模块都能正常工作,那么您就会遇到创建自定义接口不是最佳主意的情况。

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

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
  }
}
于 2012-04-17T11:33:10.680 回答