From 9d57b5b70277e334691487fe41b4e27a967308a1 Mon Sep 17 00:00:00 2001 From: Bunny <1319900154@qq.com> Date: Mon, 3 Feb 2025 21:09:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BB=84=E5=90=88=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../设计模式-v2/image-20250203210907388.png | Bin 0 -> 21543 bytes README/设计模式-v2.md | 261 +++++++++++++++++- .../java/cn/bunny/pattern14/Composite.java | 209 ++++++++++++++ 3 files changed, 466 insertions(+), 4 deletions(-) create mode 100644 README/images/设计模式-v2/image-20250203210907388.png create mode 100644 pattern/src/main/java/cn/bunny/pattern14/Composite.java diff --git a/README/images/设计模式-v2/image-20250203210907388.png b/README/images/设计模式-v2/image-20250203210907388.png new file mode 100644 index 0000000000000000000000000000000000000000..8e7a49eb93f6afccc09e85b35813827373767f4e GIT binary patch literal 21543 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

`x3&ya z!5K+_ficl>r8{xrahhX)kKeTo&=Cj4bvfO|Pczr}y!F|Z!wh5 zus^C@N%jcI9PFv$_v#;#y%8&akC$t+A&(&Z3m5TT{7e*O>mP{|8dMOI^!i1A`79b* zN~%IsStNP6rNfia=c{?@N_@QBAlmIAVKY5;>8fZCIDwB(4mr>*VTMnCm@dfkbHI3} zZh5qR|9-o`Z#)NgYnr*ZAO8Kdfq6nDy>ENzU05Yp;Qb6*IGwUw!_LpwXm_hd((I2a zEX}EvItf!^>I2%Oo!e6~|te5uXfh4@fiGz4Uzx@r+yLNh5zfd72lSnC(b3{}FyY5mW6 z(q^Sclz;{4^o5&dj}1>md*i$YcR92>(doAYR7zLHz*e)Y`lRtXSnQ!WT9fhSHdJenX{|HJf5Bk+}(CVhqI3`Jcj-HxnQv}*UPX9SCW_=>>J;9I+C9lBTEz^ zY%V6e7i(y=i<|o@lUZ-cTuuW9=9hiQXW<9~eRQl>MqqU$)Jy z)bV|~evpNz>tZrBK-}K_3y0$i37U87$t(joBmS4M*89KNQqyL9-2MM@{zr-b3gSs= XA8-*XB1!)>00lr)w3MsCZ$kbDYt;ta literal 0 HcmV?d00001 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 + ":公司财务收支管理"); + } + } +}