组合模式

定义:

  将对象组合成树形结构,以表示“部分-整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性。

处理问题:

  部分与整体的情况,存在树状结构的,即有组织的,不能平行管理(switch)。

  整体与部分可以被一致处理。例如:组装整机—配件;文档编辑器中,单个字—整段字—整个文件的操作(字体、颜色……);分公司/办事处—总部;

  有根部,有分支,更小的分支,有叶子。例:

  

使用环境:

  需求中是体现了整体、部分的层次结构时。

  希望用户忽略组合、单个对象的不同,统一地使用组合结构中的所有对象时。

  例,TreeView控件;自定义控件,将基本的控件组合起来,Control基类中的Add()、Remove();

优点:

  定义了基本对象(人力资源部、财务部)和组合对象(分公司、办事处)的层次结构。

  基本对象可以被组合成更复杂的组合对象,组合对象又可以被组合,这样不断传递下去。

  用户代码中,任何用到基本对象的地方都可以使用组合对象了。

  避免了复杂的选择判断语句。用户不用关心到底处理的是一个叶节点(基本对象)还是一个枝节点(组合对象)。

  即,组合模式让客户可以一直地使用组合结构和单个对象。

结构图:

  

  Component:

  

  Leaf:

  

  Composite:

  

  

  客户端:

  

  

  结果:

  

  注意:

  透明方式,在Component中声明所有用来管理子对象的方法,包括:Add()、Remove()等。这样实现Component接口的所有子类都具备了Add()、Remove()。好处:Leaf类(叶节点)、Composite类(枝节点)对于外界没有区别,具备完全一致的行为接口。缺点:Leaf类本身不具备Add()、Remove()的功能,实现没有意义。

  安全方式,在Composite中声明所有用来管理子对象的方法。好处:Leaf类不会出现无意义的方法。缺点:由于不够透明,Leaf(叶节点)、Composit(枝节点)接口不同。客户端调用需要做相应的判断,带来了不便。

  两者各有好处,视情况而定。

示例:

  

  公司类:抽象类或接口。

  具体公司类:实现接口,树枝节点。

  

  

  人力资源部、财务部:树叶节点。

  

  结果:

  

 

  

  

转载于:https://www.cnblogs.com/panpanwelcome/p/5591115.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值