《设计模式》-合成模式

  合成模式有时又叫做部分-整体模式(Part-Whole)。合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式可以使客户端将单纯元素与复合元素同等看待。

  一个树结构由两种节点组成:树枝节 树叶节点 枝节点可 而一个树叶节点不可以有子节点。除了根节点外,其它节点有且只有一个父节点。

  

  抽象构建角色(component):这是一个抽象角色,它给参与组 接口。这个角色给出共有接口及其默认行为。

  树叶构件角色(Lcaf):代表参加组合的树叶对象。一个树叶对象没有下级子对象。

  树枝构件角色(Composite):代表参加组合的有子对象的对象,并给出树枝构件对象的行为。

  合成模式的两种方式:

  一、透明方式

    作为第一种选择,在 Component 里面声明所有的用来管理子类对象的方法,包括 add()、remove()以及getChild()方法这样做的好处是所有的构件都有相同的接口,在客户端看来,树叶对象与合成对象的区别起码在接口层次上消失了,客户端可以同等同的对待所有的对象,这就是透明模式的合成模式。

    这个选择的缺点是不够安全。树叶类对象和合成类对象在本质上是有区别的。树叶类对象不可能有下一个层次的对象,因此 add()、remove()以及 getChild()方法没有意义,是在编译时不会出错,而只会在运行时期才会出错。

  二、安全方式

    第二种选择是在Composite 类里面声明所有的用来管理子类对象的方法。这样的做法是安全的做法。因为树叶类型的对象根本就没有管理子类对象的方法,因此,如果客户端对树叶类对象使用这些方法时,程序会在编译时期出错。

    这个选择的缺点是不够透明,因为树叶类和合成类将具有不同的接口。

    

  

  

    

  总结:合成模式可以使客户端将单纯元素与复合元素同等看待。 嗯好像里面说的就是这么一回事,就是存在无限级别的情况下 可以使用到合成模式,并且合成的对象必须包括add remove 等方法去操作子对象。这个主要一个聚合关系,就是子类里面又聚合了基类,实现了无限子类的管理。 合成模式还分为透明模式和安全模式:透明模式就是所有的子类都包含add、remove等方法 而安全模式,只是在能够拥有子类的类中添加这些方法。

  有个故事就说的是这么一个道理: 从前有个山,山里有个庙、庙里有个老和尚讲故事,讲的故事是,从前有个山.....

  

posted @ 2013-07-15 20:38  蜗牛散步  阅读(299)  评论(0编辑  收藏  举报