在Composite设计模式中,我们按照下面的UML中所示的方式处理层次结构。
但是当您查看上图中的 Leaf 类时,您会看到它具有 addComponent,removeComponent和getChild 的空实现,因为这些方法不适用于Leaf节点。我真正需要知道的是,有什么方法我们不必实现空/无操作方法吗?
更新:好的,我删除了Liskov的原则部分,因为它现在对我来说很清楚。但它仍然没有说明为什么 Leaf 节点需要强制实现这三种方法并且它有没有必要的方式?我认为还有另一个原则,即不应强制子类实现不必要的方法。我主要关心的是为Leaf节点实现三种方法,你可以在任何父子结构中考虑这种情况,不一定是复合模式。
答案 0 :(得分:2)
addComponent()
removeComponent()
和getChild()
方法仅对Composite
有意义。因此,不应在Component
的API中声明它们。
然而Leaf
中的空实现并没有违反Liskov的替代原则,只要Leaf
的行为与Component
定义它一样。我认为在你的情况下这是真的。
此外,您可以找到一个很好的例子,说明如何在java swing中实现复合模式。请查看java.awt.Component和java.awt.Container。
修改强>
我真正需要知道的是,有什么方法我们不必实现空/无操作方法吗?
使Component
成为抽象类而不是接口,并在那里实现addComponent()
removeComponent()
和getChild()
的无操作方法。
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;
}
}