![](https://img.haomeiwen.com/i792769/2dbacf2222b01605.jpg)
第19章 分公司=一部门——组合模式
概念
组合模式将对象组合成树形结构以表示“部分”、“整体”的层次关系。使得用户可以以同样的方式对待单个对象和组合对象。比如文本编辑中,字、句、段的格式化。
实现
包含部分:
- Component:公共接口,描述了各层次内部和之间可以一致对待的通用功能。包含"Add"/"Remove"
- Composite:分支(继承Component),可以包含"Add"/"Remove"接口添加子成员
- Leaf:叶子(继承Component),"Add"/"Remove"接口无用
- Client: 创建根分支、叶子,组织成树形结构,并访问。除了创建对象处,所有的使用接口传参都为父类即可。
类图如下:
![](https://img.haomeiwen.com/i792769/2cbe985bb373395f.png)
客户端使用:
![](https://img.haomeiwen.com/i792769/b21b2ef4568dce10.png)
![](https://img.haomeiwen.com/i792769/23ab7b6ef1e2cab4.png)
透明模式和安全模式
透明模式中,分支和叶子继承同样的类,让客户端避免了判断是叶子还是非叶子,只是叶子中的增删子成员无意义;安全模式相反,并且用不同的类标识叶子和树枝,但是使用时需要判断。
场景
使用场景:整体与部分,并且两者需要被同样对待。比如公司与分公司、办事处层级不同,但是使用同一套管理方式,都有财务、人力资源功能;不同在于公司、分公司可以增添子节点(一个公司多个分公司,一个分公司多个办事处),而办事处做为叶子,增添字节点的方法没有意义。这样使用组合模式,将它们组织成树形接口,再统一的方式管理整体与部分,比单独定义一个“财务”、“人力”类,给各个有层次的公司结构中平行共享的使用要合理的多。
特点:组合模式可以让用户一致地使用组合结构和单个对象。
需要仔细思考。
网友评论