• 组合模式:

  允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

  组合模式适用于创建复杂的对象,这个对象包含某些个别的对象以及这些对象的组合。

  从操作的角度而言,客户端对于 个别对象/组合 的操作是一致的。

  • 模拟场景

  如图所示,总公司下属有多个部门,而子公司可以视为多个部门的组合。

  整个数据结构呈树状,完美契合组合模式的应用场景。

  • UML:

  在这个场景中:

  1. 个别对象 -> 人事部(HRDepartment)和财务部(FinanceDepartment)
  2. 个别对象的组合 -> 公司(Company)
  3. 无论是 Company 还是 Department,对于 Client 而言,都被当做 CompanyItem 使用。
  4. 从树形结构来理解,Department 是叶节点,Company 是非叶节点。
  • 代码:
@Data
@AllArgsConstructor
@ToString
public abstract class CompanyItem { protected String name; protected void addCompanyItem(CompanyItem companyItem) {
throw new UnsupportedOperationException("Not support to add companyItem");
} protected void removeCompanyItem(CompanyItem companyItem) {
throw new UnsupportedOperationException("Not support to remove companyItem");
} protected abstract void lineOfDuty(); protected abstract void showStructure(int depth);
}
public final class Company extends CompanyItem {

    private List<CompanyItem> childCompanyItems = new ArrayList<>();

    public Company(String name) {
super(name);
} @Override
public void addCompanyItem(CompanyItem component) {
childCompanyItems.add(component);
} @Override
public void removeCompanyItem(CompanyItem component) {
childCompanyItems.remove(component);
} @Override
public void lineOfDuty() {
childCompanyItems.forEach(companyItem -> companyItem.lineOfDuty());
} @Override
public void showStructure(int depth) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < depth; ++i) {
builder.append("-");
}
System.out.println(builder.append(name));
childCompanyItems.forEach(companyItem -> companyItem.showStructure(depth + 1));
}
}
public final class FinanceDepartment extends CompanyItem {

    public FinanceDepartment(String name) {
super(name);
} @Override
public void lineOfDuty() {
System.out.println(name + ", treasurer is in charge of payroll");
} @Override
public void showStructure(int depth) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < depth; ++i) {
builder.append("-");
}
System.out.println(builder.append(name));
}
}
public final class HRDepartment extends CompanyItem {

    public HRDepartment(String name) {
super(name);
} @Override
public void lineOfDuty() {
System.out.println(name + ", HR is responsible for recruiting new employees");
} @Override
public void showStructure(int depth) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < depth; ++i) {
builder.append("-");
}
System.out.println(builder.append(name));
}
}
  • 客户端调用:
    private CompanyItem createParentCompany() {
CompanyItem parentCompany = new Company("Shanghai parent company");
parentCompany.addCompanyItem(new HRDepartment("Parent company HR department"));
CompanyItem southChildCompany = new Company("South child company");
southChildCompany.addCompanyItem(new HRDepartment("South child company HR department"));
parentCompany.addCompanyItem(southChildCompany);
CompanyItem hongKongOffice = new Company("HongKong office");
hongKongOffice.addCompanyItem(new FinanceDepartment("Hongkong office Finance department"));
southChildCompany.addCompanyItem(hongKongOffice);
parentCompany.addCompanyItem(new FinanceDepartment("Parent company Finance department"));
return parentCompany;
} @Test
void testComposite() {
CompanyItem parentCompany = createParentCompany();
parentCompany.showStructure(1);
System.out.println("===========================");
parentCompany.lineOfDuty();
}
  • 输出:

设计模式(八)组合模式 Composite的更多相关文章

  1. 乐在其中设计模式(C#) - 组合模式(Composite Pattern)

    原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...

  2. 【设计模式】组合模式 Composite Pattern

    树形结构是软件行业很常见的一种结构,几乎随处可见,  比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...

  3. 二十四种设计模式:组合模式(Composite Pattern)

    组合模式(Composite Pattern) 介绍将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性.示例有一个Message实体 ...

  4. [设计模式] 8 组合模式 Composite

    DP书上给出的定义:将对象组合成树形结构以表示“部分-整体”的层次结构.组合使得用户对单个对象和组合对象的使用具有一致性.注意两个字“树形”.这种树形结构在现实生活中随处可见,比如一个集团公司,它有一 ...

  5. python 设计模式之组合模式Composite Pattern

    #引入一 文件夹对我们来说很熟悉,文件夹里面可以包含文件夹,也可以包含文件. 那么文件夹是个容器,文件夹里面的文件夹也是个容器,文件夹里面的文件是对象. 这是一个树形结构 咱们生活工作中常用的一种结构 ...

  6. 设计模式-12组合模式(Composite Pattern)

    1.模式动机 很多时候会存在"部分-整体"的关系,例如:大学中的部门与学院.总公司中的部门与分公司.学习用品中的书与书包.在软件开发中也是这样,例如,文件系统中的文件与文件夹.窗体 ...

  7. 设计模式 笔记 组合模式 Composite

    //---------------------------15/04/16---------------------------- //Composite 组合模式----对象结构型模式 /* 1:意 ...

  8. 【设计模式】—— 组合模式Composite

    前言:[模式总览]——————————by xingoo 模式意图 使对象组合成树形的结构.使用户对单个对象和组合对象的使用具有一致性. 应用场景 1 表示对象的 部分-整体 层次结构 2 忽略组合对 ...

  9. 结构型设计模式之组合模式(Composite)

    结构 意图 将对象组合成树形结构以表示“部分-整体”的层次结构.C o m p o s i t e 使得用户对单个对象和组合对象的使用具有一致性. 适用性 你想表示对象的部分-整体层次结构. 你希望用 ...

  10. 设计模式之组合模式(Composite)

    组合模式原理:组合模式的作用是讲继承同一父类的不同子类对象组合起来,形成一个树形的结构,例如公司的部门组织 代码如下 #include <iostream> #include <st ...

随机推荐

  1. jquery.page.js插件在使用时重复触发“上一页”和“下一页”操作

    jquery.page.js使用demo HTML代码 <div class="result"> <div class="tcdPageCode&quo ...

  2. 洛谷——普及练习场 普及组选手可冲刺训练,提高组选手亦可在此巩固基础。(Loading...)

    简单的模拟 关卡2-1,6 道题 开始普及组的训练!所谓模拟,就是直接根据题意编写,思维难度简单. //T1 铺地毯 #include <cstdio> #define N 10005 i ...

  3. 【Python图像特征的音乐序列生成】第一阶段的任务分配

    从即日起到7月20号,项目成员进行了第一次任务分配. 赵同学A.岳同学.周同学,负责了图像数据的情感数据集制作,他们根据自己的经验,对图像进行了情绪提取. 赵同学B全权负责向量映射这一块的网络搭建. ...

  4. 利用jieba第三方库对文件进行关键字提取

    已经爬取到的斗破苍穹文本以TXT形式存储 代码 import jieba.analyse path = 'C:/Users/Administrator/Desktop/bishe/doupo.text ...

  5. Codeforces 666E Forensic Examination SAM or SA+线段树合并

    E. Forensic Examination http://codeforces.com/problemset/problem/666/E 题目大意:给模式串S以及m个特殊串,q个询问,询问S的子串 ...

  6. 【转】iOS开发-文件管理(一)

    iOS开发-文件管理(一) 一.iOS中的沙盒机制 iOS应用程序只能对自己创建的文件系统读取文件,这个独立.封闭.安全的空间,叫做沙盒.它一般存放着程序包文件(可执行文件).图片.音频.视频.pli ...

  7. python中os.listdir( )函数读取文件夹

    编写pytohn脚本时通常需要批处理. 列出指定目录下的所有文件/文件夹 os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表,但有个很明显的缺点,它的默认顺序不是有序的或 ...

  8. SQL Server将列以分隔符分割后存到临时表

    begin if object_id('tempdb..#t') is not null drop table #t; create table #t ( filepath ) ); declare ...

  9. 重新postgresql出现错误:Problem running post-install step. Installation may not complete correctly. The database cluster initialisation failed.

    以前正常使用的postgresql,今天出现问题:报*.dll错误.百度了一下,只能重新安装 . 在重新安装过程中报:Problem running post-install step. Instal ...

  10. linux - 权限解析

    当你在linux下用命令ll 或者ls -la的时候会看到这些字眼,这些字眼表示为不同用户组的权限:r:read就是读权限 --数字4表示w:write就是写权限 --数字2表示 x:excute就是 ...