feat: 组合模式
This commit is contained in:
parent
9d0baa8d71
commit
9d57b5b702
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
|
@ -1098,7 +1098,261 @@ public class Adapter3 {
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 组合模式---结构型1
|
## 组合模式---结构型
|
||||||
|
|
||||||
|
组合模式(Composite Pattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”层次结构。组合模式让客户端以统一的方式对待单个对象和对象组合。
|
||||||
|
|
||||||
|
![image-20250203210907388](./images/设计模式-v2/image-20250203210907388.png)
|
||||||
|
|
||||||
|
1. **Component(抽象组件)**:
|
||||||
|
- 定义了组合对象和叶子对象的共同接口。
|
||||||
|
- 在组合模式中,所有的“叶子”和“容器”类都实现此接口,因此客户端可以一致地对待这些对象。
|
||||||
|
- 例如,可以定义一个 `Operation` 方法,使得所有的组件(无论是叶子对象还是组合对象)都能执行该操作。
|
||||||
|
2. **Leaf(叶子节点)**:
|
||||||
|
- 叶子对象表示树的最末端元素,不再有子对象。
|
||||||
|
- 叶子对象继承自 `Component` 类,具体实现功能。
|
||||||
|
- 叶子对象不再包含子节点。
|
||||||
|
3. **Composite(组合节点)**:
|
||||||
|
- 组合对象也实现了 `Component` 接口,且包含多个子组件(即可以包含其他 `Leaf` 或 `Composite` 对象)。
|
||||||
|
- 组合节点负责将所有的叶子节点和子组合节点组织起来,实现“部分-整体”的结构。
|
||||||
|
|
||||||
|
### 简单示例
|
||||||
|
|
||||||
|
#### 示例代码
|
||||||
|
|
||||||
|
```java
|
||||||
|
public class Composite {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
ConcreteCompany company = new ConcreteCompany("总公司");
|
||||||
|
|
||||||
|
// 总公司的分公司
|
||||||
|
ConcreteCompany subCompany1 = new ConcreteCompany("上海分公司");
|
||||||
|
subCompany1.add(new HRDepartment("上海华东分公司"));
|
||||||
|
subCompany1.add(new FinanceDepartment("上海华东分公司"));
|
||||||
|
company.add(subCompany1);
|
||||||
|
|
||||||
|
// 总公司的分公司
|
||||||
|
ConcreteCompany subCompany2 = new ConcreteCompany("北京分公司");
|
||||||
|
subCompany2.add(new HRDepartment("北京华东分公司"));
|
||||||
|
subCompany2.add(new FinanceDepartment("北京华东分公司"));
|
||||||
|
company.add(subCompany2);
|
||||||
|
|
||||||
|
// 上海的南京分公司
|
||||||
|
ConcreteCompany subCompany3 = new ConcreteCompany("南京分公司");
|
||||||
|
subCompany3.add(new HRDepartment("南京华东分公司"));
|
||||||
|
subCompany3.add(new FinanceDepartment("南京华东分公司"));
|
||||||
|
subCompany1.add(subCompany3);
|
||||||
|
|
||||||
|
System.out.println("---------------------显示组织图---------------------");
|
||||||
|
company.display(1);
|
||||||
|
|
||||||
|
System.out.println("---------------------显示职责---------------------");
|
||||||
|
company.duty();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Component 抽象子组件
|
||||||
|
abstract static class Company {
|
||||||
|
protected String name;
|
||||||
|
|
||||||
|
public Company(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加节点
|
||||||
|
*
|
||||||
|
* @param company 子组件
|
||||||
|
*/
|
||||||
|
public abstract void add(Company company);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除节点
|
||||||
|
*
|
||||||
|
* @param company 子组件
|
||||||
|
*/
|
||||||
|
public abstract void remove(Company company);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示
|
||||||
|
*
|
||||||
|
* @param depth 深度
|
||||||
|
*/
|
||||||
|
public abstract void display(int depth);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 职责
|
||||||
|
*/
|
||||||
|
public abstract void duty();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 容器对象
|
||||||
|
static class ConcreteCompany extends Company {
|
||||||
|
|
||||||
|
private final List<Company> companyList = new ArrayList<>();
|
||||||
|
|
||||||
|
public ConcreteCompany(String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加节点
|
||||||
|
*
|
||||||
|
* @param company 子组件
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void add(Company company) {
|
||||||
|
companyList.add(company);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除节点
|
||||||
|
*
|
||||||
|
* @param company 子组件
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void remove(Company company) {
|
||||||
|
companyList.remove(company);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示
|
||||||
|
*
|
||||||
|
* @param depth 深度
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void display(int depth) {
|
||||||
|
for (int i = 0; i < depth; i++) System.out.print("-");
|
||||||
|
|
||||||
|
System.out.println(name);
|
||||||
|
|
||||||
|
for (Company company : companyList) {
|
||||||
|
company.display(depth + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 职责
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void duty() {
|
||||||
|
for (Company company : companyList) {
|
||||||
|
company.duty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 人事部门
|
||||||
|
static class HRDepartment extends Company {
|
||||||
|
public HRDepartment(String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加节点
|
||||||
|
*
|
||||||
|
* @param company 子组件
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void add(Company company) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除节点
|
||||||
|
*
|
||||||
|
* @param company 子组件
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void remove(Company company) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示
|
||||||
|
*
|
||||||
|
* @param depth 深度
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void display(int depth) {
|
||||||
|
for (int i = 0; i < depth; i++) System.out.print("-");
|
||||||
|
System.out.println(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 职责
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void duty() {
|
||||||
|
System.out.println(name + ":员工招聘培训管理");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 财务部
|
||||||
|
static class FinanceDepartment extends Company {
|
||||||
|
public FinanceDepartment(String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加节点
|
||||||
|
*
|
||||||
|
* @param company 子组件
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void add(Company company) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除节点
|
||||||
|
*
|
||||||
|
* @param company 子组件
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void remove(Company company) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示
|
||||||
|
*
|
||||||
|
* @param depth 深度
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void display(int depth) {
|
||||||
|
for (int i = 0; i < depth; i++) System.out.print("-");
|
||||||
|
System.out.println(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 职责
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void duty() {
|
||||||
|
System.out.println(name + ":公司财务收支管理");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 运行结果:
|
||||||
|
|
||||||
|
```java
|
||||||
|
---------------------显示组织图---------------------
|
||||||
|
-总公司
|
||||||
|
--上海分公司
|
||||||
|
---上海华东分公司
|
||||||
|
---上海华东分公司
|
||||||
|
---南京分公司
|
||||||
|
----南京华东分公司
|
||||||
|
----南京华东分公司
|
||||||
|
--北京分公司
|
||||||
|
---北京华东分公司
|
||||||
|
---北京华东分公司
|
||||||
|
---------------------显示职责---------------------
|
||||||
|
上海华东分公司:员工招聘培训管理
|
||||||
|
上海华东分公司:公司财务收支管理
|
||||||
|
南京华东分公司:员工招聘培训管理
|
||||||
|
南京华东分公司:公司财务收支管理
|
||||||
|
北京华东分公司:员工招聘培训管理
|
||||||
|
北京华东分公司:公司财务收支管理
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -1106,7 +1360,7 @@ public class Adapter3 {
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 代理模式---结构型1
|
## 代理模式---结构型3
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -1604,7 +1858,7 @@ public class BakeDemo {
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 状态模式---行为型1
|
## 状态模式---行为型2
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -2003,4 +2257,3 @@ Handler B处理后: 过滤请求,为了演示需要清除【,,腊鸡】这
|
||||||
Handler C处理后: 过滤请求,为了演示需要清除【,,】这些词
|
Handler C处理后: 过滤请求,为了演示需要清除【,,】这些词
|
||||||
```
|
```
|
||||||
|
|
||||||
###
|
|
||||||
|
|
|
@ -0,0 +1,209 @@
|
||||||
|
package cn.bunny.pattern14;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Composite {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
ConcreteCompany company = new ConcreteCompany("总公司");
|
||||||
|
|
||||||
|
// 总公司的分公司
|
||||||
|
ConcreteCompany subCompany1 = new ConcreteCompany("上海分公司");
|
||||||
|
subCompany1.add(new HRDepartment("上海华东分公司"));
|
||||||
|
subCompany1.add(new FinanceDepartment("上海华东分公司"));
|
||||||
|
company.add(subCompany1);
|
||||||
|
|
||||||
|
// 总公司的分公司
|
||||||
|
ConcreteCompany subCompany2 = new ConcreteCompany("北京分公司");
|
||||||
|
subCompany2.add(new HRDepartment("北京华东分公司"));
|
||||||
|
subCompany2.add(new FinanceDepartment("北京华东分公司"));
|
||||||
|
company.add(subCompany2);
|
||||||
|
|
||||||
|
// 上海的南京分公司
|
||||||
|
ConcreteCompany subCompany3 = new ConcreteCompany("南京分公司");
|
||||||
|
subCompany3.add(new HRDepartment("南京华东分公司"));
|
||||||
|
subCompany3.add(new FinanceDepartment("南京华东分公司"));
|
||||||
|
subCompany1.add(subCompany3);
|
||||||
|
|
||||||
|
System.out.println("---------------------显示组织图---------------------");
|
||||||
|
company.display(1);
|
||||||
|
|
||||||
|
System.out.println("---------------------显示职责---------------------");
|
||||||
|
company.duty();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Component 抽象子组件
|
||||||
|
abstract static class Company {
|
||||||
|
protected String name;
|
||||||
|
|
||||||
|
public Company(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加节点
|
||||||
|
*
|
||||||
|
* @param company 子组件
|
||||||
|
*/
|
||||||
|
public abstract void add(Company company);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除节点
|
||||||
|
*
|
||||||
|
* @param company 子组件
|
||||||
|
*/
|
||||||
|
public abstract void remove(Company company);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示
|
||||||
|
*
|
||||||
|
* @param depth 深度
|
||||||
|
*/
|
||||||
|
public abstract void display(int depth);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 职责
|
||||||
|
*/
|
||||||
|
public abstract void duty();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Composite 容器对象
|
||||||
|
static class ConcreteCompany extends Company {
|
||||||
|
|
||||||
|
private final List<Company> companyList = new ArrayList<>();
|
||||||
|
|
||||||
|
public ConcreteCompany(String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加节点
|
||||||
|
*
|
||||||
|
* @param company 子组件
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void add(Company company) {
|
||||||
|
companyList.add(company);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除节点
|
||||||
|
*
|
||||||
|
* @param company 子组件
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void remove(Company company) {
|
||||||
|
companyList.remove(company);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示
|
||||||
|
*
|
||||||
|
* @param depth 深度
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void display(int depth) {
|
||||||
|
for (int i = 0; i < depth; i++) System.out.print("-");
|
||||||
|
|
||||||
|
System.out.println(name);
|
||||||
|
|
||||||
|
for (Company company : companyList) company.display(depth + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 职责
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void duty() {
|
||||||
|
for (Company company : companyList) company.duty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Leaf(叶子节点)-人事部门
|
||||||
|
static class HRDepartment extends Company {
|
||||||
|
public HRDepartment(String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加节点
|
||||||
|
*
|
||||||
|
* @param company 子组件
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void add(Company company) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除节点
|
||||||
|
*
|
||||||
|
* @param company 子组件
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void remove(Company company) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示
|
||||||
|
*
|
||||||
|
* @param depth 深度
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void display(int depth) {
|
||||||
|
for (int i = 0; i < depth; i++) System.out.print("-");
|
||||||
|
System.out.println(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 职责
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void duty() {
|
||||||
|
System.out.println(name + ":员工招聘培训管理");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Leaf(叶子节点)-财务部
|
||||||
|
static class FinanceDepartment extends Company {
|
||||||
|
public FinanceDepartment(String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加节点
|
||||||
|
*
|
||||||
|
* @param company 子组件
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void add(Company company) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除节点
|
||||||
|
*
|
||||||
|
* @param company 子组件
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void remove(Company company) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示
|
||||||
|
*
|
||||||
|
* @param depth 深度
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void display(int depth) {
|
||||||
|
for (int i = 0; i < depth; i++) System.out.print("-");
|
||||||
|
System.out.println(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 职责
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void duty() {
|
||||||
|
System.out.println(name + ":公司财务收支管理");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue