设计模式总结 - 组合模式

上传人:dfg****19 文档编号:171893945 上传时间:2022-11-29 格式:DOCX 页数:11 大小:56.50KB
收藏 版权申诉 举报 下载
设计模式总结 - 组合模式_第1页
第1页 / 共11页
设计模式总结 - 组合模式_第2页
第2页 / 共11页
设计模式总结 - 组合模式_第3页
第3页 / 共11页
资源描述:

《设计模式总结 - 组合模式》由会员分享,可在线阅读,更多相关《设计模式总结 - 组合模式(11页珍藏版)》请在装配图网上搜索。

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

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

3、合模式Composite。定义(GoF设计模式):将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和使用具有一致性。涉及角色:1.Component是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。2.Leaf在组合中表示叶子结点对象,叶子结点没有子结点。3.Composite定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。适用性以下情况下适用Composite模式:1你想表示对象的部分-整体层次结构2你希望用户忽略组合

4、对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。总结组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以向处理简单元素一样来处理复杂元素。如果你想要创建层次结构,并可以在其中以相同的方式对待所有元素,那么组合模式就是最理想的选择。本章使用了一个文件系统的例子来举例说明了组合模式的用途。在这个例子中,文件和目录都执行相同的接口,这是组合模式的关键。通过执行相同的接口,你就可以用相同的方式对待文件和目录,从而实现将文件或者目录储存为目录的子级元素。如图:举例如下:java1.package posite;2./*3. *文件名称:posite.Company.java4. *创

5、建人:Fei Wong5. *创建时间:2012-06-266. *电子邮箱:7. *8. */9.public abstract class Company 10. private String name;11.12. public Company(String name) 13. this.name = name;14. 15.16. public Company() 17. 18.19. public String getName() 20. return name;21. 22.23. public void setName(String name) 24. this.name = n

6、ame;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);32.33.34.35.36.37.package posite;38.39.import java.util.ArrayList;40.import java.util.List;41./*42. *文件名称:design.singleton.CommandInvok

7、er.java43. *创建人: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. 54.55. public ConcreteCompany(String name) 56. super(name);57. cList = new ArrayList() ;58. 59.60. Ov

8、erride61. 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 StringBuilder();69. for (int i = 0; i depth; i+) 70. sb.append(-);71. 72. System.out.println(new String(sb) +

9、this.getName();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.85.86.package posite;87./*88. *文件名称:posite.FinanceDepartment.java89. *创建人:Fei Wong90. *创建时间:2012-06-2691. *电子邮箱

10、: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.protectedvoid add(Company company) 106.107. 108.109. Override110.protectedvoid display(int depth) 111. StringBui

11、lder sb = new StringBuilder();112. for (int i = 0; i depth; i+) 113. sb.append(-);114. 115. System.out.println(new String(sb) + this.getName() ) ;116. 117.118. Override119.protectedvoid romove(Company company) 120.121. 122.123.124.125.126.127.128.package posite;129./*130. *文件名称:posite.HRDepartment.j

12、ava131. *创建人:Fei Wong132. *创建时间:2012-06-26133. *电子邮箱:134. */135.public class HRDepartment extends Company 136.137.138. public HRDepartment()139.140. 141.142. public HRDepartment(String name)143. super(name);144. 145.146. Override147. protected void add(Company company) 148.149. 150.151. Override152.

13、 protected void display(int depth) 153. StringBuilder sb = new StringBuilder();154. for (int i = 0; i depth; i+) 155. sb.append(-);156. 157. System.out.println(new String(sb) + this.getName() ) ;158. 159.160. Override161. protected void romove(Company company) 162.163. 164.165.166.167.168.169.170.pa

14、ckage 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 FinanceDepartment(

15、总公司财务部);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. zaozhuangCom.add(new H

16、RDepartment(枣庄办事处人力资源部);189. Company jinanCom = new ConcreteCompany(济南办事处);190. jinanCom.add(new FinanceDepartment(济南办事处财务部);191. jinanCom.add(new HRDepartment(济南办事处人力资源部);192. shandongCom.add(jinanCom);193. shandongCom.add(zaozhuangCom);194.Company huadongCom = new ConcreteCompany(上海华东分公司);195. hua

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

18、京办事处);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. root.display(0);208. 209.210.详解2:组合模式意在组成任意复杂度的整体-部分组件层次结构,同时将单个组件或复合组

19、件视为统一的接口。我们可以将组合理解为两个层面的意思,一个是按“整体-部分”的方式一个将复杂过程组成树型结构,另一个层面则是强调整个树的执行要有统一的接口,可以被递归的调用。光看定义的话一定感觉太抽象了,网上的文章都是抄来抄去那几篇,内容很生硬,我来举个通俗点的例子解释一下大家就明白了。(本文系作者原创,请尊重作者的权利。本文欢迎转载,如转载必须注明作者及出处!)想了解更多JAVA设计模式吗?请阅读博主系列原创作品:我眼中的JAVA设计模式就拿网上常见的画图的例子来说吧,画图是一个由简到难、由局部到整体的过程,假设我们画下面的一个图:用程序来实现,我们可能会用最原始也是最直观的方法。 publ

20、ic class Picture void drawShape1() /画形状1 void drawShape2() /画形状2 void drawShape3() /画形状3 void drawPicture() drawShape1(); drawShape2(); drawShape3(); 上面的代码很直观,但问题也很明显,这样的代码是没有任何重用性可言的,换了另一副画,哪怕还是这几个图形,只是彼此相对位置稍微改动一下就得重新设计代码,所以我相信这样的代码大部分开发者是不会接受的。基于上面的理由我们来重新设计代码,将画图过程中可重用的部分抽象出来。class Rectangle /输入

21、四个角的坐标 Rectangle(Point a,Point b,Point c,Point d) void drawRectangle() /在这里画矩形 class Triangle /输入三个顶点的坐标 Rectangle(Point a,Point b,Point c) void drawTriangle() /在这里画三角型 class Picture Rectangle r1 = new Rectangle(); Rectangle r2 = new Rectangle(); Triangle t1 = new Triangle(); void drawPicture() r1.d

22、rawRectangle(); r2.drawRectangle(); t1.drawTriangle(); 在这里我们已经引入了组合的第一层含义,即将复杂的过程进行分解,然后按“整体-部分”的方式组合成树型结构。在这里,Picture是整体,Rectangle和Triangle是部分。上面的代码看起来比最初的代码要好很多了,我们实现了可重用部分的抽象。但仔细思考我们会发现上面的代码还是不够完美,如果图形非常复杂,整个结构的“树根”部分就会变得非常臃肿,在这里我们指的是drawPicture方法,想象一下一个图片由上百个图形组成。为了避免这样的情况出现,我们将画不同的Shape(Picture

23、当然也可以看成是一个Shape)的方法名称统一起来,抽象出一个统一的接口,这样我们可以用一个类似于递归的方式来处理整个过程,看下面的代码:public interface Shape /画形状 void draw();class Rectangle implements Shape /输入四个角的坐标 Rectangle(Point a,Point b,Point c,Point d) Override void draw() /在这里画矩形 class Triangle implements Shape /输入三个顶点的坐标 Rectangle(Point a,Point b,Point )

24、 Override void draw() /在这里画三角型 /这是一个复杂的Shape,由若干个其它Shpae组成class ComplexShape1 implements Shape Shape r1 = new Rectangle(); Shape r2 = new Rectangle(); Shape t1 = new Triangle(); Override void draw() r1.draw(); r2.draw(); t1.draw(); /这是一个另一个复杂的Shapeclass ComplexShape2 implements Shape Shape r1 = new

25、Rectangle(); Shape t1 = new Triangle(); Shape t2 = new Triangle(); Override void draw() r1.draw(); t1.draw(); t2.draw(); class Picture implements Shape Shape shape1 = new ComplexShape1(); Shape shape2 = new ComplexShape2(); Override void draw() shape1.draw(); shape2.draw(); 我们来看上面的代码,接口Shape表示一个抽象的图

26、形,任何图形都应该有一个draw方式用来把自己展现在画布上,draw被看作画不同图形的统一方法。在这里我们成功的引入了组合设计模式的第二层含义,正是因为有了这个统一的画图方法,我们可以用类似于上面的代码的方法来“递归”的画出一个复杂的图形。如果你了解AWT画图接口的话,你对上面的代码可能感觉很熟悉。事实上,Java正是基于组合的方式来构建整个AWT基础架构体系的。从另一个方面讲,组合模式强调以树形结构来聚合对象,而不是使用继承的方式,这是对传统面向对象编程思想的一个重大挑战。(本文系作者原创,请尊重作者的权利。本文欢迎转载,如转载必须注明作者及出处!)想了解更多JAVA设计模式吗?请阅读博主系列原创作品:我眼中的JAVA设计模式

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!