复合设计模式和空替代

xmaestro

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

复合设计模式

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

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

RenéLink

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

但是Leaf,只要Leafs的行为符合Component定义,它中的空实现不会破坏Liskov的替换原理我认为这对您来说是正确的。

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章