设计模式---组合设计模式

组合模式(Composite Pattern),又称部分整体模式,用于把一组相似的对象当做一个单一的对象,组合模式依据树形来组合对象,用来表示部分以及整体层次,为结构型设计模式,它创建来对象组的树形结构。

意图:将对象组合成树形结构以表示“部分-整体”的结构层次,组合模式使得用户对单个对象和组合对象的使用具有一致性。
主要解决:在树形结构的问题中,模糊类简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使客户程序与复杂元素的内部结构解耦
使用场景:1、想要表达对象的部分-整体层次结构(树形结构)。2希望用户忽略组合对象与单个对象的不同,用户统一使用组合结构中的对象。
关键代码:树枝和叶子实现统一接口,树枝内部组合该接口并且内部含属性list,里面放component。

注意:
1)组合模式不是父子关系
组合模式的树形结构容易让人误认为是组合对象和也对象的父子关系,这是不正确的。组合对象和叶子对象对组合接口实现是不同的,尤其是叶子对象没有对List的操作。
组合模式是一种HAS-A(聚合)的关系,而非IS-A,组合对象包含一组叶对象,叶对象可能也是组合对象,也可能是真正的叶对象,就好比文件夹下面可能是文件,也可能是子文件夹,子文件夹下再包含文件。
2)对叶对象操作的一致性
组合模式除了要求组合对象和叶对象有相同的接口之外,还有一个必要的条件:对一组叶对象的操作必须具有一致性。
3)双向映射关系
一个叶对象可能属于多个组合对象,这样对象自检的关系不是严格意义上的层次结构,这种情况必须给父节点和子节点建立双向映射关系,简单的做法就是给组合对象和叶对象都增加集合来保存对象的引用。这样会使对象之间的耦合性增强,修改和增删一个对象都会变得困难,此时可以引入中介模式来管理这些对象
4)用职责链模式提高组合模式性能
在组合模式中,如果树的结构比较复杂,节点数量很多,在遍历树的过程中,性能方面也许表现得不够理想。有时候我们确实可以借助一些技巧,在实际操作中避免遍历整棵树,有一种现成的方案是借助职责链模式。职责链模式一般需要我们手动去设置 链条,但在组合模式中,父对象和子对象之间实际上形成了天然的职责链。让请求顺着链条从父对象往子对象传递,或者是反过来从子对象往父对象传递,直到遇到可以处理该请求的对象为止,这也是职责链模式的经典运用场景之一。
5)与其它模式关系
与装饰模式经常一起使用时,他们通常会用一个公共的类,所以装饰必须具有Add、Remove和GetChild 操作的Component接口。
经常与迭代器模式一起使用,进行遍历Composite;
观察者模式 Visitor将本来应该分布在Composite和L e a f类中的操作和行为局部化

原文地址:https://www.cnblogs.com/ShouWangYiXin/p/11102671.html