摘要:本文用一个实例场景描述Gof 23设计模式中的合成模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型。
关键字:Gof 23 设计模式 合成模式 Quarkus

1 基础知识
1.1 标准定义

合成(Composite)模式标准定义:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
1.2 分析和说明
合成(Composite)模式属于结构型设计模式。它将对象组合成树形结构以表示“整体-部分” 的层次结构,定义了包含基本对象和组合对象的类层次结构,使得用户对单个对象和组合对象的使用具有一致性。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来,使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。
合成(Composite)模式结构如图1所示。其角色包括抽象构件(Component)角色、树枝构件(Composite)角色和树叶构件(Leaf)角色。
图1 合成模式结构
抽象构件(Component)角色:这是一个抽象角色,它给参加组合的对象定义出公共的接口及其默认行为,可以用来管理所有的子对象。合成对通常把它所包含的子对象当作类型为Component的对象。在安全式的合成模式里,构件角色并不定义出管理子对象的方法,这一定义由树枝构件对象给出。为用户操作Leaf类和Composite类提供一致的方法,它主要定义了Operation(),Add(Component),Remove(Component),GetChild(int)几个方法,其中,Add(Component),Remove(Component),GetChild(int)的责任是对“整体”(Composite类)进行操作;Operation()是“部分”(Leaf类)和“整体”(Composite类)都需要的方法。
树枝构件(Composite)角色:代表参加组合的有下级子对象的对象。树枝构件类给出所有的管理子对象的方法,如add()、remove()以及components()的声明。除拥有Operation()方法外,还有“整体” 类操作的方法, 比如Add(Component),Remove(Component),GetChild(int)。Composite 对象由Composite对象和Leaf对象聚合而成,既可以包含“部分”,也可以包含“整体”。
树叶构件(Leaf)角色:树叶对象是没下级子对象的对象,定义出参加组合的原始对象的行为。它拥有Opertion()方法即可满足用户需求的操作。

2 应用场景举例
比如团队(组织)是一个总体的抽象类。集团公司、公司、工厂、部门、班组、项目组是一个团队,都可以继承团队。但是团队本身也是有层次结构的。比如我们要构架一个软件公司,就要这样先形成公司,在形成公司下面的部门,接着形成部门下面的项目组。如果构架一个工厂性质的公司,那在形成完公司根节点后开始形成公司下属的工厂,在工厂下面再形成车间。实现用例图见图2所示。
图2 合成模式用例图
在这里可以把抽象组织(AbstractOrganization)理解为抽象构件(Component)角色。公司(Corporation)、工厂(Factory)、部门(Department)理解为树枝构件(Composite)角色,在其下面还有组织。车间(Workshop)和项目组(WorkTeam)理解为树叶构件(Leaf)角色,在其下面已经没有组织了。而其结构类图如图3所示。公司类(Corporation)、工厂类(Factory)、部门类(Department)、车间类(Workshop)和项目组类(WorkTeam)全部都继承抽象组织类(AbstractOrganization)。
图3 合成模式类图
合成模式实现的顺序图如图4所示,实现顺序描述:①-⑥都是新建对象,分别为Corporation对象、deaprt1对象、deaprt2对象、deaprt3对象、team1对象和team2对象。⑦-⑨是把deaprt1对象、deaprt2对象和deaprt3对象插入到Corporation对象下,作为Corporation对象的下级子对象。⑩-⑩ 是把team1对象和team2对象插入到deaprt1对象下,作为deaprt1对象的下级子对象。
图4 合成模式实现顺序图
在一个公司组织机构中,公司下面有部门,部门下面有项目组。如果要形成一个公司组织,先创建公司根节点,然后创建公司下属的部门子节点。有的部门下面还有项目组,接着可以在部门节点下面创建项目组孙节点。

3.Quarkus的实现程序代码
Quarkus程序实现主要包括AbstractOrganization抽象类文件,Corporation类文件,Department类文件,Factory类文件,Workshop类文件和WorkTeam类文件等6个文件。其关系如图3所示。下面分别列出这6个文件的程序代码,最后列出测试代码并显示输出结果。
AbstractOrganization抽象类程序代码清单01所示。
程序代码清单01

public abstract class AbstractOrganization { protected String organizationName;protected String organizationType;public AbstractOrganization(String name){organizationName = name;}   public void add(AbstractOrganization organization){};public void remove(AbstractOrganization organization){};public void showOrganizationStructure(String parentName){}public String getOrganizationName() {return organizationName;}public void setOrganizationName(String organizationName) {this.organizationName = organizationName;}
}

Corporation具体类,Department具体类和Factory具体类继承AbstractOrganization抽象类,其程序代码清单02所示。
程序代码清单02

@Dependent
public class Corporation extends AbstractOrganization {private List<AbstractOrganization> componentList = new ArrayList<AbstractOrganization>();public Corporation() {this.organizationType = "Corporation";}public void add(AbstractOrganization organization) {componentList.add(organization);}public void showOrganizationStructure(String parentName) {String organizationName = this.getOrganizationName();System.out.println(parentName + organizationName);for (int i = 0; i < componentList.size(); i++) {AbstractOrganization organization = componentList.get(i);organization.showOrganizationStructure(parentName+ organizationName + "——");}}}@Dependent
public class Department extends AbstractOrganization{private List<AbstractOrganization> componentList = new ArrayList<AbstractOrganization>();public Department (String name){     super(name);organizationType = "Department";}public Department (){organizationType = "Department";}public void add(AbstractOrganization organization){componentList.add(organization);}public void showOrganizationStructure(String parentName){String organizationName = this.getOrganizationName();System.out.println(parentName + organizationName);     for (int i=0; i<componentList.size(); i++){AbstractOrganization organization = componentList.get(i);organization.showOrganizationStructure(parentName+organizationName+"——");}}
}@Dependent
public class Factory extends AbstractOrganization{private List<AbstractOrganization> componentList = new ArrayList<AbstractOrganization>();public Factory (String name){       super(name);organizationType = "Factory";}public Factory (){     organizationType = "Factory";}public void add(AbstractOrganization organization){componentList.add(organization);}public void showOrganizationStructure(String parentName){String organizationName = this.getOrganizationName();System.out.println(parentName + organizationName);     for (int i=0; i<componentList.size(); i++){AbstractOrganization organization = componentList.get(i);organization.showOrganizationStructure(parentName+organizationName+"——");}       }
}

Workshop具体类和WorkTeam具体类继承AbstractOrganization抽象类,其程序代码清单03所示。
程序代码清单03

@Dependent
public class Workshop extends AbstractOrganization{public Workshop (String name){       super(name);organizationType = "Workshop";}public Workshop (){       organizationType = "Workshop";}public void add(AbstractOrganization c){System.out.println("这是叶子节点,下面没有内容");}public void showOrganizationStructure(String parentName){String organizationName = this.getOrganizationName();System.out.println(parentName+ organizationName);       }
}@Dependent
public class WorkTeam extends AbstractOrganization{public WorkTeam (String name){       super(name);organizationType = "WorkTeam";}public WorkTeam (){       organizationType = "WorkTeam";}public void add(AbstractOrganization c){System.out.println("这是叶子节点,下面没有内容");}public void showOrganizationStructure(String parentName){String organizationName = this.getOrganizationName();System.out.println(parentName+ organizationName);       }
}

合成模式测试程序的代码清单04如下:
程序代码清单04

public class CompositeClient implements QuarkusApplication {@ConfigProperty(name = "gof23.structuralpattern.composite.title", defaultValue = "gof23")String title;@Inject    Corporation corporation1;@Inject   Department depart1, depart2, depart3;@Inject   WorkTeam team1, team2;public void scene1() {// 场景1,形成公司-部门-项目组的公司结构corporation1.addName("公司A");depart1.addName("部门1");depart2.addName("部门2");depart3.addName("部门3");corporation1.add(depart1);corporation1.add(depart2);corporation1.add(depart3);       team1.addName("项目组1");team2.addName("项目组2");depart1.add(team1);depart1.add(team2);corporation1.showOrganizationStructure("");}@Inject    Corporation corporation2;@Inject   Factory factory1, factory2, factory3;@Inject   Workshop team3, team4;public void scene2() {// 场景2,形成公司-工厂-车间的工厂结构       corporation2.addName("公司B");      factory1.addName("工厂1");factory2.addName("工厂2");factory3.addName("工厂3");corporation2.add(factory1);corporation2.add(factory2);corporation2.add(factory3);team3.addName("车间1");team4.addName("车间2");factory1.add(team3);factory1.add(team4);corporation2.showOrganizationStructure("");}@Overridepublic int run(String... args) {System.out.println("———————" + title + "演示输出——————");    scene1();System.out.println();scene2();return 0;}public static void main(String... args) {Quarkus.run(CompositeClient.class, args);}
}

合成模式测试类输出结果如下所示:

公司A
公司A——部门1
公司A——部门1——项目组1
公司A——部门1——项目组2
公司A——部门2 公司A——部门3

公司A
公司A——工厂1
公司A——工厂1——车间1
公司A——工厂1——车间2
公司A——工厂2
公司A——工厂3

4. 相关Quarkus程序源码下载
可以直接从github上获取代码,读者可以从github上clone预先准备好的示例代码。

git clone https://github.com/rengang66/quarkus-sample-gof23.git

这是一个Maven项目,然后Maven导入工程。该程序位于“src\main\java\com\iiit\quarkus\sample\gof23\structuralpattern\composite”目录中。
同时也可以从gitee上clone预先准备好的示例代码,命令如下:

git clone https://gitee.com/rengang66/quarkus-sample-gof23.git

参考文献

[1] E.Gamma, R.Helm, R.Johnson, and Vlissides. Design Patterns Elements of Reusable Object Oriented Software. Addison-Wesley, 1995
[2] E.Gamma, R.Helm, R.Johnson, and Vlissides.著,李英军等译,设计模式:可复用面向对象软件的基础,北京:机械工业出版社.2000.9.
[3] 阎宏,Java与模式,北京:电子工业出版社. 2002.10
[4] 王俊峰 戚晓滨. 设计模式和UML. 计算机应用研究,1999.16(5), 27-29,39.
[5] 陈琴 朱正强. UML在设计模式描述中的应用. 计算机工程与设计,2003.24(4), 81-84.
[6] 戴建国 郭理 曹传东. JUnit框架剖析. 计算机与数字工程,2008.36(8), 43-45,135.
[7] 刘兵. JUnit设计模式分析. 程序员,2003.(6), 51-57,60.
[8] 顾颖 徐良贤 贾银军. JUnit设计模式分析和应用. 计算机工程,2004.30(B12), 178-179,182.
[9] 吴信永 宋东 刘飞. 基于构件技术的通用ATS框架设计. 计算机测量与控制,2008.16(2), 141-143,155.
[10] 马维达. ACE与GoF设计模式——ACE_Message_Block与Composite模式. 程序员,2004.(2), 104-105.
[11] 肖计划 刘海砚 张吉才. 设计模式在地图制图软件开发中的应用. 测绘工程,2008.17(5), 4-7,11.
[12] 李光俊 华庆一 吴海松. 基于AOP技术的Composite模式的改进. 计算机工程,2008.34(10), 73-74,77.
[13] 饶一梅 王治宝. 软件设计模式及其在Java类库中的典型实现. 计算机工程与应用,2002.38(4), 48-50.
[14] 王晓波 蔡汉明 王军 崔慧敏. 设计模式在线切割CAD软件开发中的应用. 机电工程技术,2006.35(2),44-47.
[15] 肖保良 宋东 赵胜. 基于模式的ATS领域框架研究. 计算机测量与控制,2007.15(9), 1144-1147.
[16] 夏克长. Composite模式的C#实现. 计算机时代,2006.(3), 3-5.
[17] 倪叶青. 合成(Composite)模式及在range处理中的应用. 电脑知识与技术:学术交流,2005.(8), 50-52.
[18] 邓楠 苑津莎 杨薛明. 基于组合模式的地理信息矢量图元可重用性的研究. 电力系统通信,2005.26(5), 57-60.
[19] 肖志峰 龚健雅 王艳东 翟晓芳. 面向对象的软件设计模式在配电GIS中的应用. 测绘信息与工程,2005.30(3), 3-5.
[20] 聂颖. 设计模式在图形处理软件中的应用. 计算机应用,2004.24(B12), 189-191.
[21] Quarkus官网. https://quarkus.io/

08-合成模式Quarkus实现相关推荐

  1. java 类的合成_Java设计模式-合成模式

    合成模式有时也叫组合模式,对象组合成树形结构以表示"部分-整体"的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.掌握组合模式的重点是要理解清楚 "部分/ ...

  2. java设计模式---合成模式3

    实例 下面以一个逻辑树为例子,以上面的原理图为蓝本,看看如何实现并如何使用这个树,这个结构很简单,但是如何去使用树,遍历树.为我所用还是有一定难度的.   这里主要用到树的递归遍历,如何递归.如何控制 ...

  3. java设计模式---合成模式2

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

  4. java设计模式---合成模式

    合成模式把部分和整体关系用树结构表示,是属于对象的结构模式.合成模式要对组合的对象进行管理,所以在一定位置给予对象的相关管理方法,如:add(),remove()等.合成模式中对象的管理有两种方案. ...

  5. 【Android 应用开发】Paint 图形组合 Xfermod 之 合成模式表示方法 ( Xfermod 使用步骤 | 透明度 颜色值 公式表示方法 | 老版本表示方法 | 合成区域分块 )

    文章目录 Xfermod 使用步骤 合成方程 ( Compositing equations ) 老版本的表示方法 合成模式 相关 区域 Xfermod 使用步骤 Xfermod 使用步骤 : ① 创 ...

  6. 合成模式(Composite Pattern)

    http://www.cnblogs.com/singlepine/archive/2005/10/30/265001.html 一. 合成(Composite)模式 合成模式有时又叫做部分-整体模式 ...

  7. 《JAVA与模式》之合成模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述合成(Composite)模式的: 合成模式属于对象的结构模式,有时又叫做"部分--整体"模式.合成模式将对象组织到树 ...

  8. php 23种设计模型 - 组合模式(合成模式)

    组合模式(Composite) 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这 ...

  9. 15-责任链模式Quarkus实现

    摘要:本文用一个实例场景描述Gof 23设计模式中的责任链模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 责任链模式 Quarkus 1 基 ...

最新文章

  1. 前端每周清单第 49 期:Webpack 4 Beta 尝鲜,React Windowing 与 setState 分析
  2. ICANN:新类别顶级域名2013年才能开放申请
  3. 2019年上海市数学建模讲座笔记(2)概率统计模型
  4. DL之RNN:人工智能为你写代码——基于TF利用RNN算法实现生成编程语言代码(C++语言)、训练测试过程全记录
  5. 广州城市地图为android,广州无障碍地图
  6. 【华为云技术分享】小白学YOLO:YOLOv3网络结构细致解析
  7. 编程猫获新一轮 3 亿融资:做好少儿编程教育基础设施!
  8. SQL Server 2008入门系列之设置数据库服务器的访问权限
  9. 鸿蒙有什么好处,鸿蒙系统有什么好处-鸿蒙系统有什么用-鸿蒙系统有什么区别...
  10. PlistEdit Pro 1.9.2 plist文件编辑软件
  11. python银行管理系统框架_基于Python的网上银行综合管理系统的设计与实现
  12. 刷百度权重那些不为人知的事情
  13. ps 图片 透明度 设置
  14. Openwrt Web gui LUCI 流程浅析
  15. 什么是和谐操作系统? 华为新操作系统介绍
  16. 微信小程序用户信息解
  17. 【机器学习】基于mnist数据集的手写数字识别
  18. 家乡 二 十 四 桥的介绍
  19. Android 这些技术 —— 你都了解过吗
  20. 挂载硬盘 linux_Linux怎么挂载移动硬盘光盘U盘之案例分享

热门文章

  1. 评测TFN便携式无线电综合测试仪4900BM性能如何
  2. 事后分析:暴雪的暗黑破坏神 II【翻译】
  3. 在滴滴和头条2年,我的总结与感悟
  4. 低配电脑安装VMware Workstation虚拟机
  5. 人脸搜索引擎准得吓人,记者:我都不知道自己拍过这些照片
  6. 软件测试沟通技巧,高效沟通技巧一 - Mrsjjl的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  7. 如何发现网络中的设备 设备发现协议(收集)
  8. python数据写入表格生成图片_python在word文档里插入图片和表格实例代码演示
  9. ASEMI代理MIMXRT1064CVJ5B原装现货NXP车规级MIMXRT1064CVJ5B
  10. 【TypeScript入门】TypeScript入门篇——类