在Composite设计模式中,我们按照下面的UML中所示的方式处理层次结构。
但是,当您查看上图中的Leaf类时,您会看到它具有addComponent,removeComponent和getChild的空实现,因为这些方法不适用于Leaf节点。我真正需要知道的是,有什么方法可以不必实现空/无操作方法?
更新:好的,因为我现在很清楚,所以我删除了Liskov的原理部分。但是,它仍然没有阐明为什么Leaf节点需要强制实现这三种方法,并且有没有一种不必强制执行的方法?我认为还有另一个原则规定,不应强迫子类实现不必要的方法。我主要关心的是为Leaf节点实现三种方法,您可以在任何父子结构(不一定是Composite模式)中考虑这种情况。
该addComponent()
removeComponent()
和getChild()
方法才有意义了Composite
。因此,不应在Component
的API中声明它们。
但是Leaf
,只要Leaf
s的行为符合Component
定义,它中的空实现不会破坏Liskov的替换原理。我认为这对您来说是正确的。
此外,您可以找到一个很好的示例,说明如何在Java swing中实现复合模式。看一看java.awt.Component和java.awt.Container。
编辑
我真正需要知道的是,有什么方法可以不必实现空/无操作方法?
使Component
一个抽象类而不是一个接口,addComponent()
removeComponent()
并getChild()
在那里实现no-op方法。
public abstract class Component {
public abstract doOperation(); // still need to be implemented by subclasses
/**
* Empty stub method. Subclasses may override it.
*/
public void addComponent(Component comp){
}
public void removeComponent(Component comp){
}
public Component getChild(int index){
return null;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句