Composite模式
Composite模式体现部分与整体的关系,形象的比喻就如树形图。树中有根节点、枝节点(可以包含子节点)、叶节点(无子节点)。
Composite模式有两种方式:
1.透明方式,就是在根节点中声明所有用来管理子节点的方法,比如Add、Remove等。这样对于叶节点来说,会产生一些无意义的代码重写。
2.安全方式,只在枝节点中声明管理子节点的方法。但是,当出现某些三层继承时,会有些麻烦。比如,根节点A包含Add、Remove方法;枝节点B继承A,不需要Add、Remove方法,重写为空;C继承B,需要Add、Remove方法,又重写A的方法,这样就会造成重复的代码。参看.Net Framework中Control、HtmlControl、HtmlContainerControl的实现,它很巧妙地增加了一个类ControlCollection作为聚合处理,Add、Remove等方法都移到ControlCollection类中,不论是枝节点还是叶节点,只要对根节点的Controls属性进行重写,就能给自己定位为枝节点或叶节点,同时通过EmptyControlCollection类保障了控件的安全。
这个模式中,还学到面向对象设计中的【开放-封闭原则】(Open-Closed Principle),即对扩展是开放的,对更改则是封闭的。