diff --git a/README/images/设计模式-v2/image-20250203210907388.png b/README/images/设计模式-v2/image-20250203210907388.png new file mode 100644 index 0000000..8e7a49e Binary files /dev/null and b/README/images/设计模式-v2/image-20250203210907388.png differ diff --git a/README/设计模式-v2.md b/README/设计模式-v2.md index b2292ec..715b1d0 100644 --- a/README/设计模式-v2.md +++ b/README/设计模式-v2.md @@ -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 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处理后: 过滤请求,为了演示需要清除【,,】这些词 ``` -### diff --git a/pattern/src/main/java/cn/bunny/pattern14/Composite.java b/pattern/src/main/java/cn/bunny/pattern14/Composite.java new file mode 100644 index 0000000..a888643 --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern14/Composite.java @@ -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 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 + ":公司财务收支管理"); + } + } +}