意图
将对象组成树形结构来表示“部分——整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
使用场合
表达式:四则运算、逻辑运算及SQL语句等都可以使用组合模式。
命令:一个命令经常可以由若干子命令组成。
事务:最典型的事务是测试用例。
结构
(1)Componente:组合中的对象声明接口,用于访问和管理Component的组件。在递归机构中第一个接口,用于访问一个父部件。
(2)Leaf:在组合中表示叶结点对象,叶节点没有子节点,定义对象的基本行为。
(3)Composite:定义有子部件的那些部件的行为,存储部件并在Componente接口中实现与子部件有关的操作。
(4)Client:通过Componente接口操作组合部件的对象。
效果
1.组合对象可以由基本对象和其它组合对象构成。采用有限的基本对象就可以生成众多的组合对象。
2.组合对象与基本对象有相同的接口,这样操作组合对象就与操作简单对象相同。客户端代码会被大大简化,并不需要关心组合对象与基本对象的区别。
3.可以很容易的增加类型,由于新类型符合相同的接口,因此不需要改动客户端代码。
.NET控件——组合模式在.NET中的实例
一个典型的组合模式就是Net的控件,如Button、TextBox和Label等,这些控件都继承自Control类,该类自身包含ControlCollection的集合Controls。控件和子控件的逻辑关系如图。
控件和子控件的逻辑关系
MRP中的BOM
1.问题:材料清单是MRP的基础数据,反映了产品与零件之间的装配关系。在BOM文件中应该反映零件之间的上下级关系和某个零件的最低级别等信息。
2.结构:我们可以采用组合模式表示BOM文件,将不可拆分的零件作为简单零件,其它零件作为复合零件,机构如图
3.效果:MRP最根本的目的是根据需要生产的产品的数量计算各种基本工件的数量和生产加工周期,从而安排生产、库存和原材料供应。
采用组合模式,可以大大简化计算每种工件的算法。