设计模式(八)组合模式 Composite
- 组合模式:
允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
组合模式适用于创建复杂的对象,这个对象包含某些个别的对象以及这些对象的组合。
从操作的角度而言,客户端对于 个别对象/组合 的操作是一致的。
- 模拟场景
如图所示,总公司下属有多个部门,而子公司可以视为多个部门的组合。
整个数据结构呈树状,完美契合组合模式的应用场景。
- UML:
在这个场景中:
- 个别对象 -> 人事部(HRDepartment)和财务部(FinanceDepartment)
- 个别对象的组合 -> 公司(Company)
- 无论是 Company 还是 Department,对于 Client 而言,都被当做 CompanyItem 使用。
- 从树形结构来理解,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的更多相关文章
- 乐在其中设计模式(C#) - 组合模式(Composite Pattern)
原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...
- 【设计模式】组合模式 Composite Pattern
树形结构是软件行业很常见的一种结构,几乎随处可见, 比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...
- 二十四种设计模式:组合模式(Composite Pattern)
组合模式(Composite Pattern) 介绍将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性.示例有一个Message实体 ...
- [设计模式] 8 组合模式 Composite
DP书上给出的定义:将对象组合成树形结构以表示“部分-整体”的层次结构.组合使得用户对单个对象和组合对象的使用具有一致性.注意两个字“树形”.这种树形结构在现实生活中随处可见,比如一个集团公司,它有一 ...
- python 设计模式之组合模式Composite Pattern
#引入一 文件夹对我们来说很熟悉,文件夹里面可以包含文件夹,也可以包含文件. 那么文件夹是个容器,文件夹里面的文件夹也是个容器,文件夹里面的文件是对象. 这是一个树形结构 咱们生活工作中常用的一种结构 ...
- 设计模式-12组合模式(Composite Pattern)
1.模式动机 很多时候会存在"部分-整体"的关系,例如:大学中的部门与学院.总公司中的部门与分公司.学习用品中的书与书包.在软件开发中也是这样,例如,文件系统中的文件与文件夹.窗体 ...
- 设计模式 笔记 组合模式 Composite
//---------------------------15/04/16---------------------------- //Composite 组合模式----对象结构型模式 /* 1:意 ...
- 【设计模式】—— 组合模式Composite
前言:[模式总览]——————————by xingoo 模式意图 使对象组合成树形的结构.使用户对单个对象和组合对象的使用具有一致性. 应用场景 1 表示对象的 部分-整体 层次结构 2 忽略组合对 ...
- 结构型设计模式之组合模式(Composite)
结构 意图 将对象组合成树形结构以表示“部分-整体”的层次结构.C o m p o s i t e 使得用户对单个对象和组合对象的使用具有一致性. 适用性 你想表示对象的部分-整体层次结构. 你希望用 ...
- 设计模式之组合模式(Composite)
组合模式原理:组合模式的作用是讲继承同一父类的不同子类对象组合起来,形成一个树形的结构,例如公司的部门组织 代码如下 #include <iostream> #include <st ...
随机推荐
- jquery.page.js插件在使用时重复触发“上一页”和“下一页”操作
jquery.page.js使用demo HTML代码 <div class="result"> <div class="tcdPageCode&quo ...
- 洛谷——普及练习场 普及组选手可冲刺训练,提高组选手亦可在此巩固基础。(Loading...)
简单的模拟 关卡2-1,6 道题 开始普及组的训练!所谓模拟,就是直接根据题意编写,思维难度简单. //T1 铺地毯 #include <cstdio> #define N 10005 i ...
- 【Python图像特征的音乐序列生成】第一阶段的任务分配
从即日起到7月20号,项目成员进行了第一次任务分配. 赵同学A.岳同学.周同学,负责了图像数据的情感数据集制作,他们根据自己的经验,对图像进行了情绪提取. 赵同学B全权负责向量映射这一块的网络搭建. ...
- 利用jieba第三方库对文件进行关键字提取
已经爬取到的斗破苍穹文本以TXT形式存储 代码 import jieba.analyse path = 'C:/Users/Administrator/Desktop/bishe/doupo.text ...
- Codeforces 666E Forensic Examination SAM or SA+线段树合并
E. Forensic Examination http://codeforces.com/problemset/problem/666/E 题目大意:给模式串S以及m个特殊串,q个询问,询问S的子串 ...
- 【转】iOS开发-文件管理(一)
iOS开发-文件管理(一) 一.iOS中的沙盒机制 iOS应用程序只能对自己创建的文件系统读取文件,这个独立.封闭.安全的空间,叫做沙盒.它一般存放着程序包文件(可执行文件).图片.音频.视频.pli ...
- python中os.listdir( )函数读取文件夹
编写pytohn脚本时通常需要批处理. 列出指定目录下的所有文件/文件夹 os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表,但有个很明显的缺点,它的默认顺序不是有序的或 ...
- SQL Server将列以分隔符分割后存到临时表
begin if object_id('tempdb..#t') is not null drop table #t; create table #t ( filepath ) ); declare ...
- 重新postgresql出现错误:Problem running post-install step. Installation may not complete correctly. The database cluster initialisation failed.
以前正常使用的postgresql,今天出现问题:报*.dll错误.百度了一下,只能重新安装 . 在重新安装过程中报:Problem running post-install step. Instal ...
- linux - 权限解析
当你在linux下用命令ll 或者ls -la的时候会看到这些字眼,这些字眼表示为不同用户组的权限:r:read就是读权限 --数字4表示w:write就是写权限 --数字2表示 x:excute就是 ...