设计模式总结-组合模式_第1页
设计模式总结-组合模式_第2页
设计模式总结-组合模式_第3页
设计模式总结-组合模式_第4页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、- 精品 word 文档 值得下载 值得拥有 -注:文档内容基本上来自于网上,并加上自己的理解而成。有的觉得网友总结得非常好,就完全照搬下来,供学习之用。然而,有的摘抄并没有加上原链接和出处,请谅解。要点:1. 用于处理树形结构的问题中,它模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素内部结构解耦。2. 组合模式可以优化处理递归或者分级数据结构。我们可以将组合理解为两个层面的意思,一个是按“整体-部分”的方式一个将复杂过程组成树型结构,另一个层面则是强调整个树的执行要有统一的接口,可以被递归的调用。3. 应用场景: OS 文件系统, J

2、Unit1. (Composite Pattern)组合模式详解 1:组合模式 (Composite Pattern) 有时候又叫做部分 -整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素 ,从而使得客户程序与复杂元素的内部结构解耦。组合模式让你可以优化处理递归或分级数据结构。有许多关于分级数据结构的例子,使得组合模式非常有用武之地。关于分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的:文件系统。文件系统由目录和文件组成。每个目录都可以装内容。目录的内容可以是文件,也可以是目录。按照这种方式,计算机的文件系统就是以递归结构

3、来组织的。如果你想要描述这样的数据结构,- 精品 word 文档 值得下载 值得拥有 - 精品 word 文档 值得下载 值得拥有 -那么你可以使用组合模式Composite 。定义 (GoF 设计模式 ):将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和使用具有一致性。涉及角色:1.Component是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为 。声明一个接口用于访问和管理Component子部件。2.Leaf在组合中表示叶子结点对象,叶子结点没有子结点。3.Composite定义有枝节点行为,用来存储子部件,在Component接口中实

4、现与子部件有关操作,如增加(add) 和删除 (remove)等。适用性以下情况下适用Composite模式:1你想表示对象的部分-整体层次结构2你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。总结组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以向处理简单元素一样来处理复杂元素。如果你想要创建层次结构,并可以在其中以相同的方式对待所有元素,那么组合模式就是最理想的选择。本章使用了一个文件系统的例子来举例说明了组合模式的用途。在这个例子中,文件和目录都执行相同的接口,这是组合模式的关键。通过执行相同的接口,你就可以用相同的方式对待文件和目录,从而实现将文

5、件或者目录储存为目录的子级元素。- 精品 word 文档 值得下载 值得拥有 - 精品 word 文档 值得下载 值得拥有 -如图 :举例如下:java1. package posite;2. /*3. * 文件名称:4. * 创建人: Fei Wong5. * 创建时间: 2012-06-266. * 电子邮箱:7. *8. */9. public abstract class Company 10. private String name;11.12. public Company(String name) 13. = name;14. 15.16. public Co

6、mpany() 17. 18.19. public String getName() 20. return name;21. 22.23. public void setName(String name) 24. = name;25. 26.27. protected abstract void add(Company company);28.29. protected abstract void romove(Company company);30.31. protected abstract void display(int depth);- 精品 word 文档 值得

7、下载 值得拥有 - 精品 word 文档 值得下载 值得拥有 -32. 6.37. package designcomposite.;1. /*42. * 文件名称:43. * 创建人: Fei Wong44. * 创建时间: 2012-06-2645. * 电子邮箱:46. *47. */48. public class ConcreteCompany extends Company 49. private List cList;50.51. public ConcreteCompany() 52. cList = new ArrayList();53

8、. 54.55. public ConcreteCompany(String name) 56. super(name);57. cList = new ArrayList() ;58. 59.60. Override61. protected void add(Company company) 62. cList.add(company);63. 64.65. Override66. protected void display(int depth) 67. / TODO Auto-generated method stub68. StringBuilder sb = new StringB

9、uilder();69. for (int i = 0; i depth; i+) 70. sb.append(-);71. 72.73. for (Company c : cList) 74. c.display(depth + 2); /注意:其实这里是一个递归调用75. 76. 77.78. Override79. protected void romove(Company company) 80. cList.remove(company);81. 82. 83.84.- 精品 word 文档 值得下载 值得拥有 - 精品 word 文档 值得下载 值得拥有 -85.86. packa

10、ge posite;87. /*88. * 文件名称:89. * 创建人: Fei Wong90. * 创建时间: 2012-06-2691. * 电子邮箱:92. */93. public class FinanceDepartment extends Company 94.95.96. public FinanceDepartment()97.98. 99.100. public FinanceDepartment(String name)101. super(name);102. 103.104. Override105. protected void add(Company compa

11、ny) 106.107. 108.109. Override110. protected void display(int depth) 111. StringBuilder sb = new StringBuilder();112. for (int i = 0; i depth; i+) 113. sb.append(-);114. 115.116. 117.118. Override119. protected void romove(Company company) 120.121. 122.123. 27.128. package posite;129. /

12、*130. * 文件名称:131. * 创建人: Fei Wong132. * 创建时间: 2012-06-26133. * 电子邮箱:134. */135. public class HRDepartment extends Company 136.137.- 精品 word 文档 值得下载 值得拥有 - 精品 word 文档 值得下载 值得拥有 -138. public HRDepartment()139.140. 141.142. public HRDepartment(String name)143. super(name);144. 145.146. Override147. pro

13、tected void add(Company company) 148.149. 150.151. Override152. protected void display(int depth) 153. StringBuilder sb = new StringBuilder();154. for (int i = 0; i depth; i+) 155. sb.append(-);156. 157.158. 159.160. Override161. protected void romove(Company company) 162.163. 164.165.

14、69.170. package posite;171.172. public class Client 173.174. /*175. * param args176. */177. public static void main(String args) 178. / TODO Auto-generated method stub179. Company root = new ConcreteCompany();180. root.setName(北京总公司 );181. root.add(new HRDepartment(总公司人力资源部 );182. root.add(new Finan

15、ceDepartment(总公司财务部 );183. Company shandongCom = new ConcreteCompany(山东分公司 );184.shandongCom.add(new HRDepartment(山东分公司人力资源部 );185.shandongCom.add(new FinanceDepartment(山东分公司账务部 );186. Company zaozhuangCom = new ConcreteCompany(枣庄办事处 );187.zaozhuangCom.add(new FinanceDepartment(枣庄办事处财务部 );188.zaozhu

16、angCom.add(new HRDepartment(枣庄办事处人力资源部 );189. Company jinanCom = new ConcreteCompany(济南办事处 );- 精品 word 文档 值得下载 值得拥有 - 精品 word 文档 值得下载 值得拥有 -190.jinanCom.add(new FinanceDepartment(济南办事处财务部 );191.jinanCom.add(new HRDepartment(济南办事处人力资源部 );192. shandongCom.add(jinanCom);193. shandongCom.add(zaozhuangCo

17、m);194. Company huadongCom = new ConcreteCompany(上海华东分公司 );195.huadongCom.add(new HRDepartment(上海华东分公司人力资源部 );196.huadongCom.add(new FinanceDepartment(上海华东分公司账务部 );197. Company hangzhouCom = new ConcreteCompany(杭州办事处 );198. hangzhouCom.add(new FinanceDepartment(杭州办事处财务部 );199. hangzhouCom.add(new HR

18、Department(杭州办事处人力资源部 );200. Company nanjingCom = new ConcreteCompany(南京办事处 );201.nanjingCom.add(new FinanceDepartment(南京办事处财务部 );202.nanjingCom.add(new HRDepartment(南京办事处人力资源部 );203. huadongCom.add(hangzhouCom);204. huadongCom.add(nanjingCom);205. root.add(shandongCom);206. root.add(huadongCom);207

19、. root.display(0);208. 209.210. 详解 2:组合模式意在组成任意复杂度的 整体 - 部分 组件层次结构,同时将单个组件或复合组件视为统一的接口。我们可以将组合理解为两个层面的意思,一个是按“整体-部分”的方式一个将复杂过程组成树型结构,另一个层面则是强调整个树的执行要有统一的接口,可以被递归的调用。光看定义的话一定感觉太抽象了,网上的文章都是抄来抄去那几篇,内容很生硬,我来举个通俗点的例子解释一下大家就明白了。(本文系作者原创,请尊重作者的权利。本文欢迎转载,如转载必须注明作者及出处!)想了解更多JAVA 设计模式吗?请阅读博主系列原创作品:我眼中的JAVA 设计

20、模式就拿网上常见的画图的例子来说吧,画图是一个由简到难、由局部到整体的过程,假设我们画下面的一个图:- 精品 word 文档 值得下载 值得拥有 - 精品 word 文档 值得下载 值得拥有 -用程序来实现,我们可能会用最原始也是最直观的方法。public class Picture void drawShape1()/ 画形状 1void drawShape2()/ 画形状 2void drawShape3()/ 画形状 3void drawPicture()drawShape1();drawShape2();drawShape3();上面的代码很直观,但问题也很明显,这样的代码是没有任何重

21、用性可言的,换了另一副画,哪怕还是这几个图形,只是彼此相对位置稍微改动一下就得重新设计代码,所以我相信这样的代码大部分开发者是不会接受的。基于上面的理由我们来重新设计代码,将画图过程中可重用的部分抽象出来。class Rectangle/ 输入四个角的坐标- 精品 word 文档 值得下载 值得拥有 - 精品 word 文档 值得下载 值得拥有 -Rectangle(Point a,Point b,Point c,Point d)void drawRectangle()/ 在这里画矩形class Triangle/ 输入三个顶点的坐标Rectangle(Point a,Point b,Poin

22、t c)void drawTriangle()/ 在这里画三角型class Picture Rectangle r1 = new Rectangle();Rectangle r2 = new Rectangle();Triangle t1 = new Triangle();void drawPicture()r1.drawRectangle();r2.drawRectangle();t1.drawTriangle();在这里我们已经引入了组合的第一层含义,即将复杂的过程进行分解,然后按“整体- 部分”的方式组合成树型结构。在这里, Picture是整体, Rectangle和 Triangle

23、是部分。- 精品 word 文档 值得下载 值得拥有 - 精品 word 文档 值得下载 值得拥有 -上面的代码看起来比最初的代码要好很多了,我们实现了可重用部分的抽象。但仔细思考我们会发现上面的代码还是不够完美,如果图形非常复杂,整个结构的“树根”部分就会变得非常臃肿,在这里我们指的是drawPicture方法,想象一下一个图片由上百个图形组成。为了避免这样的情况出现,我们将画不同的Shape ( Picture当然也可以看成是一个Shape )的方法名称统一起来,抽象出一个统一的接口,这样我们可以用一个类似于递归的方式来处理整个过程,看下面的代码:public interface Shap

24、e/ 画形状void draw();class Rectangle implements Shape/ 输入四个角的坐标Rectangle(Point a,Point b,Point c,Point d)Overridevoid draw()/ 在这里画矩形class Triangle implements Shape/ 输入三个顶点的坐标Rectangle(Point a,Point b,Point )Overridevoid draw()/ 在这里画三角型- 精品 word 文档 值得下载 值得拥有 - 精品 word 文档 值得下载 值得拥有 -/ 这是一个复杂的 Shape ,由若干个其它 Shpae 组成class ComplexShape1 implements Shape Shape r1 = new Rectangle();Shape r2 = new Rectangle();Shape t1 = new Triangle();Overridevoid draw()r1.draw(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论