组合模式(Composite模式)详解.pdf

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
组合模式(Composite模式)详解 在现实⽣活中,存在很多“部分-整体”的关系,例如,⼤学中的部门与学院、总公司中的部门与分公司、学习⽤品中的书与书包、⽣活⽤ 品中的⾐⽉⾉与⾐柜以及厨房中的锅碗瓢盆等。在软件开发中也是这样,例如,⽂件系统中的⽂件与⽂件夹、窗体程序中的简单控件与容器 控件等。对这些简单对象与复合对象的处理,如果⽤组合模式来实现会很⽅便。 1.组合模式的定义与特点 组合(Composite)模式的定义:有时⼜叫作部分-整体模式,它是⼀种将对象组合成树状的层次结构的模式,⽤来表⽰“部分-整体”的关 系,使⽤户对单个对象和组合对象具有⼀致的访问性。 组合模式的主要优点有: 1. 组合模式使得客户端代码可以⼀致地处理单个对象和组合对象,⽆须关⼼⾃⼰处理的是单个对象,还是组合对象,这简化了客户端代 码 ; 2. 更容易在组合体内加⼊新的对象,客户端不会因为加⼊了新的对象⽽更改源代码,满⾜ “开闭原则” ; 其主要缺点是: 1. 设计较复杂,客户端需要花更多时间理清类之间的层次关系; 2. 不容易限制容器中的构件 ; 3. 不容易⽤继承的⽅法来增加构件的新功能; 2.组合模式的结构与实现 组合模式的结构不是很复杂,下⾯对它的结构和实现进⾏分析。 2.1模式的结构 组合模式包含以下主要⾓⾊。 1. 抽象构件(Component)⾓⾊ :它的主要作⽤是为树叶构件和树枝构件声明公共接⼝,并实现它们的默认⾏为。在透明式的组合模式 中抽象构件还声明访问和管理⼦类的接⼝;在安全式的组合模式中不声明访问和管理⼦类的接⼝,管理⼯作由树枝构件完成。 2. 树叶构件(Leaf)⾓⾊ :是组合中的叶节点对象,它没有⼦节点,⽤于实现抽象构件⾓⾊中 声明的公共接⼝。 3. 树枝构件(Composite)⾓⾊ :是组合中的分⽀节点对象,它有⼦节点。它实现了抽象构件⾓⾊中声明的接⼝,它的主要作⽤是存储 和管理⼦部件,通常包含 Add()、Remove()、GetChild() 等⽅法。 组合模式分为透明式的组合模式和安全式的组合模式。 (1) 透明⽅式:在该⽅式中,由于抽象构件声明了所有⼦类中的全部⽅法,所以客户端⽆须区别树叶对象和树枝对象,对客户端来说是透明 的。但其缺点是:树叶构件本来没有 Add()、Remove() 及 GetChild() ⽅法,却要实现它们 (空实现或抛异常),这样会带来⼀些安全性 问题。其结构图如图 1 所⽰。 (2) 安全⽅式:在该⽅式中,将管理⼦构件的⽅法移到树枝构件中,抽象构件和树叶构件没有对⼦对象的管理⽅法,这样就避免了上⼀种⽅ 式的安全性问题,但由于叶⼦和分⽀有不同的接⼝,客户端在调⽤时要知道树叶对象和树枝对象的存在,所以失去了透明性。其结构图如图 2 所⽰。 2.2 模式的实现 假如要访问集合 c0={leaf1,{leaf2,leaf3}} 中的元素,其对应的树状图如图 3 所⽰。 下⾯给出透明式的组合模式的实现代码,与安全式的组合模式的实现代码类似,只要对其做简单修改就可以了。 package composite; import java.util.ArrayList; public class CompositePattern { public static void main(String[] args) { Component c0=new Composite(); Component c1=new Composite(); Component leaf1=new Leaf("1"); Component leaf2=new Leaf("2"); Component leaf3=new Leaf("3"); c0.add(leaf1); c0.add(c1); c1.add(leaf2); c1.add(leaf3); c0.operation(); } } //抽象构件 interface Component { public void add(Component c); public void remove(Component c); public Component getChild(int i);

文档评论(0)

千帆起航 + 关注
实名认证
内容提供者

走过路过,不要错过!

认证主体杨**

1亿VIP精品文档

相关文档

相关课程推荐