在Java中扩展2个类的变通方法的标准做法

时间:2017-06-12 20:54:20

标签: java design-patterns

这是方案

interface BaseMsg
interface SpecialMsg

class FooBaseMsg implements BaseMsg
class FooSpecialMsg extends FooBaseMsg implements SpecialMsg

// The above classes are written by another team, and cannot be modified. 

class BarBaseMsg implements BaseMsg // totally different way to implement
class BarSpecialMsg // this is the question

SpecialMsg中为FooSpecialMsg实施的方法与BarSpecialMsg中完全相同。

因此,复制粘贴实现

是非常糟糕的做法

BaseMsg的方法不同。

我目前的方法是

class BarSpecialMsg extends BarBaseMsg implements SpecialMsg
  private FooSpecialMsg foo;
  // constructors will have super(), and initialize FooSpecialMsg
  // implements methods from SpecialMsg by calling
  // foo.methods()

这是正确的方法吗?这类问题的标准是什么?

是否有某种设计模式可以解决这个问题?

当前方法的缺点是数据是重复的,因为它为每次使用使用2个对象的资源

1 个答案:

答案 0 :(得分:1)

  

这是正确的方法吗?这种标准是什么?   问题?

     

是否有某种设计模式可以解决这个问题?

您使用合成来分享共同的行为 这是一种有效的方法 实际上,您已经使用了设计模式:适配器或包装器。

BarSpecialMsg是适配器类,FooSpecialMsg是适配器类 或者从包装器模式的角度来看,BarSpecialMsg是包装类,FooSpecialMsg是包装类。

  

在FooSpecialMsg中为SpecialMsg实现的方法完全是   与BarSpecialMsg相同。

     

但BaseMsg的方法不同

但是,我没有看到将FooSpecialMsgBarSpecialMsg结合的优势。

如果[{1}}中定义的用于实现FooSpecialMsg界面的方法不应由BaseMsg使用,我认为用BarSpecialMsg撰写BarSpecialMsg可能会出错-易于。此外,它在两个实现之间创建了一个非常不需要的耦合。

在这种情况下,定义实现FooSpecialMsg的公共类似乎更好。

SpecialMsg

通过这种方式,您可以使用public class CommonSpecialMsg implements SpecialMsg {...} 的实例撰写FooSpecialMsgBarSpecialMsg,并将CommonSpecialMsg的实施委托给它:

SpecialMsg