这是方案
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个对象的资源
答案 0 :(得分:1)
这是正确的方法吗?这种标准是什么? 问题?
是否有某种设计模式可以解决这个问题?
您使用合成来分享共同的行为
这是一种有效的方法
实际上,您已经使用了设计模式:适配器或包装器。
BarSpecialMsg
是适配器类,FooSpecialMsg
是适配器类
或者从包装器模式的角度来看,BarSpecialMsg
是包装类,FooSpecialMsg
是包装类。
在FooSpecialMsg中为SpecialMsg实现的方法完全是 与BarSpecialMsg相同。
但BaseMsg的方法不同
但是,我没有看到将FooSpecialMsg
与BarSpecialMsg
结合的优势。
如果[{1}}中定义的用于实现FooSpecialMsg
界面的方法不应由BaseMsg
使用,我认为用BarSpecialMsg
撰写BarSpecialMsg
可能会出错-易于。此外,它在两个实现之间创建了一个非常不需要的耦合。
在这种情况下,定义实现FooSpecialMsg
的公共类似乎更好。
SpecialMsg
通过这种方式,您可以使用public class CommonSpecialMsg implements SpecialMsg {...}
的实例撰写FooSpecialMsg
和BarSpecialMsg
,并将CommonSpecialMsg
的实施委托给它:
SpecialMsg