feat: 组合模式

This commit is contained in:
Bunny 2025-02-03 21:09:54 +08:00
parent 9d0baa8d71
commit 9d57b5b702
3 changed files with 466 additions and 4 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -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处理后: 过滤请求,为了演示需要清除【,,】这些词
``` ```
###

View File

@ -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 + ":公司财务收支管理");
}
}
}