当前位置:网站首页>组合模式(Composite Pattern)
组合模式(Composite Pattern)
2022-07-29 20:37:00 【贺兰猪】
组合模式,又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
树形结构是很常见的,比如目录系统,随便点开一个文件夹,文件夹下面可能有文件,也有子文件夹,子文件夹中还有子子文件夹和文件等。还有公司的部门构造等,展开来看都是树形的结构。
将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
优点: 1、高层模块调用简单。 2、节点自由增加。
缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
使用场景:1、你想表示对象的部分-整体层次结构(树形结构)。 2、希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。部分、整体场景,如树形菜单,文件、文件夹的管理。
模式的结构:在组合模式结构图中包含如下几个角色
Component(抽象构件):它可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子构件的方法,如增加子构件、删除子构件、获取子构件等。
Leaf(叶子构件):它在组合结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为。对于那些访问及管理子构件的方法,可以通过异常等方式进行处理。
Composite(容器构件):它在组合结构中表示容器节点对象,容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为,包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法。
示例:
我们有一个类 Employee,该类被当作组合模型类。CompositePatternDemo 类使用 Employee 类来添加部门层次结构,并打印所有员工。
先创建 Employee 类,该类带有 Employee 对象的列表。
Employee.java
import java.util.ArrayList;
import java.util.List;
public class Employee {
private String name;
private String dept;
private int salary;
private List<Employee> subordinates; //构造函数
public Employee(String name, String dept, int sal) {
this.name = name;
this.dept = dept;
this.salary = sal;
subordinates = new ArrayList<Employee>();
}
public void add(Employee e) {
subordinates.add(e);
}
public void remove(Employee e) {
subordinates.remove(e);
}
public List<Employee> getSubordinates() {
return subordinates;
}
public String toString() {
return ("Employee :[ Name : " + name + ", dept : " + dept + ", salary :" + salary + " ]");
}
}
使用 Employee 类来创建和打印员工的层次结构。
CompositePatternDemo.java
public class CompositePatternDemo {
public static void main(String[] args) {
Employee CEO = new Employee("John", "CEO", 30000);
Employee headSales = new Employee("Robert", "Head Sales", 20000);
Employee headMarketing = new Employee("Michel", "Head Marketing", 20000);
Employee clerk1 = new Employee("Laura", "Marketing", 10000);
Employee clerk2 = new Employee("Bob", "Marketing", 10000);
Employee salesExecutive1 = new Employee("Richard", "Sales", 10000);
Employee salesExecutive2 = new Employee("Rob", "Sales", 10000);
CEO.add(headSales);
CEO.add(headMarketing);
headSales.add(salesExecutive1);
headSales.add(salesExecutive2);
headMarketing.add(clerk1);
headMarketing.add(clerk2);
//打印该组织的所有员工
// System.out.println(CEO);
for (Employee headEmployee : CEO.getSubordinates()) {
System.out.println(headEmployee);
for (Employee employee : headEmployee.getSubordinates()) {
System.out.println(employee);
}
}
}
}
执行程序,输出结果为:
Employee :[ Name : John, dept : CEO, salary :30000 ] Employee :[ Name : Robert, dept : Head Sales, salary :20000 ] Employee :[ Name : Richard, dept : Sales, salary :10000 ] Employee :[ Name : Rob, dept : Sales, salary :10000 ] Employee :[ Name : Michel, dept : Head Marketing, salary :20000 ] Employee :[ Name : Laura, dept : Marketing, salary :10000 ] Employee :[ Name : Bob, dept : Marketing, salary :10000 ]
边栏推荐
- Cooler Navigation helps you shop easily in shopping malls without confusion
- Fully automated machine learning modeling!The effect hangs the primary alchemist!
- 藻酸盐/PEI/DNA复合载体|脂质-鱼精蛋白-DNA复合物|合成方法
- PyQt5学习一(环境搭建)
- Permutations of a small feat: cantor
- 【数据库】mysql日期格式转换
- .NET 6.0中使用Identity框架实现JWT身份认证与授权
- 解析掌握现代化少儿编程实操能力
- 人社部公布“数据库运行管理员”成新职业,OceanBase参与制定职业标准
- 酷客导航助你商场轻松购物,业务办理不迷茫
猜你喜欢
写出优雅的Kotlin代码:聊聊我认为的 “Kotlinic“
剑指 Offer II 097. 子序列的数目
Liu Genghong, boys and girls, come here!Sports data analysis and mining!(with a full set of code and data sets)
刘畊宏男孩女孩看过来!运动数据分析挖掘!(附全套代码和数据集)
VR直播营销需求增加,数据模块为我们铺路
336. Palindromic Pairs
conda virtual environment | install and list problems
The younger brother asked: Is the work of a programmer a day’s work of code?
南信大提出TIPCB,一个简单但有效的用于基于文本的人员搜索的基于部分的卷积baseline
单壁碳纳米管-DNA复合物(SWCNT-DNA)|作用机理
随机推荐
酷客导航助你商场轻松购物,业务办理不迷茫
Use the PostgreSQL GRANT command to modify permissions on various database objects
7 行代码搞崩溃 B 站,原因令人唏嘘!
[ACTF2020 新生赛]Exec 1
南华早报 | 助力亚洲最具公信力报章实现AD域自动化管理
七个易犯的 IT 管理错误—以及如何避免
根据昵称首字母生成头像
240. 搜索二维矩阵 II
基于PaddleSpeech搭建个人语音听写服务
进程间六种通信方式
剑指 Offer II 097. 子序列的数目
分布式之基石: 可靠性——What a tangled web we weave
促进二十一世纪创客教育的新发展
【593. Valid Square】
SAP ABAP OData 服务 Data Provider Class 的 GET_ENTITYSET 方法实现指南试读版
mos管闩锁效应理解学习
第二好PyTorch新手课程;论文写作指南;使用µGo语言开发迷你编译器;超高效使用Transformer的扩展库;前沿论文 | ShowMeAI资讯日报
LeetCode--single linked list--146.LRU cache
一线技术人应该关注的四种思维能力
解析掌握现代化少儿编程实操能力