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