当前位置:网站首页>组合模式(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 ]
边栏推荐
- C#笔记 之 Oracle.ManagedDataAccess包的安装及配置
- 促进二十一世纪创客教育的新发展
- 模型推理模板
- 剑指 Offer II 097. 子序列的数目
- 南信大提出TIPCB,一个简单但有效的用于基于文本的人员搜索的基于部分的卷积baseline
- Cobaltstrike和BurpSuite桌面快捷配置
- Kotlin - Coroutine Scope CoroutineScope, Coroutine Builder CoroutineBuilder, Coroutine Scope Function CoroutineScope Functiom
- 手写dialog弹框
- 从专业角度分析国内创客教育发展
- 全自动化机器学习建模!效果吊打初级炼丹师!
猜你喜欢
![[ACTF2020 新生赛]Exec 1](/img/1e/a3c19d514207e6965d09c66b86e519.png)
[ACTF2020 新生赛]Exec 1

4. Implementation Guide for GET_ENTITYSET Method of SAP ABAP OData Service Data Provider Class

Cobaltstrike and BurpSuite desktop shortcut configuration

磁性层状双金属氢氧化物和酶-DNA复合物|聚乙烯亚胺-DNA复合物(PEI/DNA)|作用机理

相亲信息

一 JS中Promise用法、二闭包的概念与用法、三对象创建的四种方式与区区别、四 如何声明一个类

7 行代码搞崩溃 B 站,原因令人唏嘘!

mos管闩锁效应理解学习

【无标题】

ALBERT:A Lite BERT for Self-supervised Learning of Language Representations
随机推荐
In 2022, you still can't "low code"?Data science can also play with Low-Code!
GET_ENTITYSET Method Implementation Guide for SAP ABAP OData Service Data Provider Class
378. The Kth Smallest Element in an Ordered Matrix
JSP Servlet JDBC MySQL CRUD Sample Tutorial
Durable rules (persistent rules engine) learning notes
SAG1-MIC8复合DNA基因疫苗|新型脂质-HAP-DNA复合体|实验要求
用 Array.every & Array.some 匹配全部/部分内容 es6
Oracle问题: ORA-01882: 未找到时区
1. Promise usage in JS, 2. The concept and usage of closures, 3. The difference between the four methods and areas of object creation, 4. How to declare a class
MySQL - 设计游戏用户信息表
系列(jupyter自动保存失败)
干货!联邦学习中的合作均衡
QT安装、创建项目与调试,在VS中的使用:手把手教程
Cooler Navigation helps you shop easily in shopping malls without confusion
用对象字面量或Map替代Switch/if语句
打破原则!MongoDB 引入 SQL?
MySQL Data Query - Union Query
断言+异常处理类,代码更简洁了
关于云计算的海量数据存储模型[通俗易懂]
MySQL数据查询 - 联合查询