复合设计模式和空覆盖

时间:2014-03-17 07:30:16

标签: java design-patterns composite

在Composite设计模式中,我们按照下面的UML中所示的方式处理层次结构。

Composite design pattern

但是当您查看上图中的 Leaf 类时,您会看到它具有 addComponent,removeComponent和getChild 的空实现,因为这些方法不适用于Leaf节点。我真正需要知道的是,有什么方法我们不必实现空/无操作方法吗?

更新:好的,我删除了Liskov的原则部分,因为它现在对我来说很清楚。但它仍然没有说明为什么 Leaf 节点需要强制实现这三种方法并且它有没有必要的方式?我认为还有另一个原则,即不应强制子类实现不必要的方法。我主要关心的是为Leaf节点实现三种方法,你可以在任何父子结构中考虑这种情况,不一定是复合模式。

1 个答案:

答案 0 :(得分:2)

addComponent() removeComponent()getChild()方法仅对Composite有意义。因此,不应在Component的API中声明它们。

然而Leaf中的空实现并没有违反Liskov的替代原则,只要Leaf的行为与Component定义它一样。我认为在你的情况下这是真的。

此外,您可以找到一个很好的例子,说明如何在java swing中实现复合模式。请查看java.awt.Componentjava.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;
     }
}