From c58b4b3628d56d67873c07cb04d01dd31c293cc5 Mon Sep 17 00:00:00 2001 From: Bunny <1319900154@qq.com> Date: Thu, 6 Feb 2025 17:23:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=A1=A5=E6=8E=A5=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../设计模式-v2/image-20250205223403477.png | Bin 0 -> 23902 bytes .../设计模式-v2/image-20250206163950552.png | Bin 0 -> 29054 bytes README/设计模式-v2.md | 299 +++++++++++++++++- .../main/java/cn/bunny/pattern19/Bridge.java | 77 +++++ .../java/cn/bunny/pattern20/VisitorDemo.java | 65 ++++ .../java/cn/bunny/pattern20/VisitorDemo1.java | 150 +++++++++ 6 files changed, 590 insertions(+), 1 deletion(-) create mode 100644 README/images/设计模式-v2/image-20250205223403477.png create mode 100644 README/images/设计模式-v2/image-20250206163950552.png create mode 100644 pattern/src/main/java/cn/bunny/pattern19/Bridge.java create mode 100644 pattern/src/main/java/cn/bunny/pattern20/VisitorDemo.java create mode 100644 pattern/src/main/java/cn/bunny/pattern20/VisitorDemo1.java diff --git a/README/images/设计模式-v2/image-20250205223403477.png b/README/images/设计模式-v2/image-20250205223403477.png new file mode 100644 index 0000000000000000000000000000000000000000..dc0401840bc1700ed65c93709a6ad281916d3008 GIT binary patch literal 23902 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 agP00mpQBEcTYx1FiIn9vAf>Wqul^sAGx-Jp literal 0 HcmV?d00001 diff --git a/README/设计模式-v2.md b/README/设计模式-v2.md index 645f260..3e399b2 100644 --- a/README/设计模式-v2.md +++ b/README/设计模式-v2.md @@ -1517,6 +1517,119 @@ public class Proxy { ## 桥接模式---结构型 +桥接模式通过“桥接”抽象和实现,使得两者可以独立地变化。它通常应用于那些有多个维度可扩展的系统中,这样可以避免类爆炸,减少子类的数量,提升代码的可维护性。 + +![image-20250205223403477](./images/设计模式-v2/image-20250205223403477.png) + +**需要角色** + +**Abstraction(抽象化角色)**: + +- 定义了抽象部分的接口,并且保持一个指向实现部分的引用。 + +**RefinedAbstraction(扩充抽象化角色)**: + +- 继承自 Abstraction,通常会扩展其接口。 + +**Implementor(实现者角色)**: + +- 定义了实现类的接口,这个接口不会太复杂,可以和抽象角色分离。 + +**ConcreteImplementor(具体实现者角色)**: + +- 实现了 Implementor 接口,定义了具体的实现方式。 + +### 简单示例 + +#### 示例代码 + +```java +public class Bridge { + public static void main(String[] args) { + // 使用不同的绘制方式 + Shape circle1 = new Circle(5, 10, 2, new DrawingAPI1()); // 使用屏幕绘制 + Shape circle2 = new Circle(10, 20, 3, new DrawingAPI2()); // 使用打印机绘制 + + circle1.draw(); + circle2.draw(); + + // 调整圆形大小 + circle1.resize(1.5); + circle2.resize(0.5); + + circle1.draw(); + circle2.draw(); + } + + // Implementor: 定义绘制图形的接口 + interface DrawingAPI { + void drawCircle(double x, double y, double radius); + } + + // ConcreteImplementor: 屏幕绘制实现 + static class DrawingAPI1 implements DrawingAPI { + @Override + public void drawCircle(double x, double y, double radius) { + System.out.println("Drawing Circle on Screen: (" + x + ", " + y + ") with radius " + radius); + } + } + + // ConcreteImplementor: 打印机绘制实现 + static class DrawingAPI2 implements DrawingAPI { + @Override + public void drawCircle(double x, double y, double radius) { + System.out.println("Drawing Circle on Printer: (" + x + ", " + y + ") with radius " + radius); + } + } + + // Abstraction: 定义图形接口 + static abstract class Shape { + protected DrawingAPI drawingAPI; + + protected Shape(DrawingAPI drawingAPI) { + this.drawingAPI = drawingAPI; + } + + public abstract void draw(); + + public abstract void resize(double factor); + } + + // RefinedAbstraction: 圆形 + static class Circle extends Shape { + private final double x; + private final double y; + private double radius; + + public Circle(double x, double y, double radius, DrawingAPI drawingAPI) { + super(drawingAPI); + this.x = x; + this.y = y; + this.radius = radius; + } + + @Override + public void draw() { + drawingAPI.drawCircle(x, y, radius); + } + + @Override + public void resize(double factor) { + radius *= factor; + } + } +} +``` + +#### 运行结果: + +```java +Drawing Circle on Screen: (5.0, 10.0) with radius 2.0 +Drawing Circle on Printer: (10.0, 20.0) with radius 3.0 +Drawing Circle on Screen: (5.0, 10.0) with radius 3.0 +Drawing Circle on Printer: (10.0, 20.0) with radius 1.5 +``` + --- ## 策略模式---行为型 @@ -2716,13 +2829,197 @@ public class Iterator { ## 访问者模式---行为型 +访问者模式(Visitor Pattern)是一种行为设计模式,它允许你在不修改元素类的前提下,定义新的操作。通过使用访问者模式,可以将操作和元素的结构分离,从而让你在不修改元素类的情况下,向其中添加新的操作。 + +![image-20250206163950552](./images/设计模式-v2/image-20250206163950552.png) + +**需要角色** + +**Element(元素)**:所有的元素类都需要实现此接口,它定义了`accept()`方法来接受访问者的访问。 + +**ConcreteElement(具体元素)**:这是实现Element接口的类,代表具体的对象,可以是任何你希望执行操作的对象。 + +**Visitor(访问者)**:这个接口定义了对所有元素类的访问方法。 + +**ConcreteVisitor(具体访问者)**:这是实现Visitor接口的类,具体执行对元素的操作。 + +**Object Structure(对象结构)**:一个包含所有元素对象的容器。它遍历所有元素对象并调用它们的`accept()`方法,传入访问者进行操作。 + +### 简单示例 + +#### 代码示例 + +```java +public class VisitorDemo1 { + public static void main(String[] args) { + BusinessReport report = new BusinessReport(); + System.out.println("-------------------CEO-------------------"); + report.showReport(new CEOVisitor()); + + System.out.println("-------------------CTO-------------------"); + report.showReport(new CTOVisitor()); + } + + // 访问者 + interface Visitor { + /** + * 访问者-工程师 + */ + void visit(Engineer engineer); + + /** + * 访问者-经理 + */ + void visit(Manger manger); + } + + // 具体访问者-CEO + static class CEOVisitor implements Visitor { + + /** + * 访问者-工程师 + * + * @param engineer 工程师 + */ + @Override + public void visit(Engineer engineer) { + System.out.println("工程师:" + engineer.name + ",KPI:" + engineer.kpi); + } + + /** + * 访问者-经理 + * + * @param manger 经理 + */ + @Override + public void visit(Manger manger) { + System.out.println("经理:" + manger.name + ",KPI:" + manger.kpi); + } + } + + // 具体访问者-CTO + static class CTOVisitor implements Visitor { + + /** + * 访问者-工程师 + * + * @param engineer 工程师 + */ + @Override + public void visit(Engineer engineer) { + System.out.println("工程师:" + engineer.name + ",代码行数:" + engineer.getCodeLines()); + } + + /** + * 访问者-经理 + * + * @param manger 经理 + */ + @Override + public void visit(Manger manger) { + System.out.println("经理:" + manger.name + ",产品数:" + manger.getProducts()); + } + } + + // 员工抽象 + static abstract class Employee { + public String name; + public int kpi; + + public Employee(String name) { + this.name = name; + this.kpi = new Random().nextInt(10); + } + + // 接受访问者访问 + public abstract void accept(Visitor visitor); + } + + // 员工具体---工程师 + static class Engineer extends Employee { + + public Engineer(String name) { + super(name); + } + + /** + * @param visitor 访问者 + */ + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } + + public int getCodeLines() { + return new Random().nextInt(10000); + } + } + + // 员工具体---经理 + static class Manger extends Employee { + + public Manger(String name) { + super(name); + } + + /** + * @param visitor 访问者 + */ + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } + + public int getProducts() { + return new Random().nextInt(10); + } + } + + // 员工报表类 + static class BusinessReport { + private final List employeeList = new ArrayList<>(); + + public BusinessReport() { + employeeList.add(new Manger("经理-A")); + employeeList.add(new Manger("经理-B")); + employeeList.add(new Manger("经理-C")); + employeeList.add(new Manger("经理-D")); + employeeList.add(new Manger("经理-E")); + } + + public void showReport(Visitor visitor) { + for (Employee employee : employeeList) { + employee.accept(visitor); + } + } + } +} +``` + +#### 运行结果: + +```java +-------------------CEO------------------- +经理:经理-A,KPI:9 +经理:经理-B,KPI:6 +经理:经理-C,KPI:7 +经理:经理-D,KPI:6 +经理:经理-E,KPI:9 +-------------------CTO------------------- +经理:经理-A,产品数:7 +经理:经理-B,产品数:4 +经理:经理-C,产品数:9 +经理:经理-D,产品数:9 +经理:经理-E,产品数:2 +``` + --- ## 解释器模式---行为型 --- -## 责任链模式---行为型-未完成。。。 +## 责任链模式---行为型 主要有两个角色:抽象处理者(Handler)、具体处理者(Concrete Handler) diff --git a/pattern/src/main/java/cn/bunny/pattern19/Bridge.java b/pattern/src/main/java/cn/bunny/pattern19/Bridge.java new file mode 100644 index 0000000..2f4475e --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern19/Bridge.java @@ -0,0 +1,77 @@ +package cn.bunny.pattern19; + +public class Bridge { + public static void main(String[] args) { + // 使用不同的绘制方式 + Shape circle1 = new Circle(5, 10, 2, new DrawingAPI1()); // 使用屏幕绘制 + Shape circle2 = new Circle(10, 20, 3, new DrawingAPI2()); // 使用打印机绘制 + + circle1.draw(); + circle2.draw(); + + // 调整圆形大小 + circle1.resize(1.5); + circle2.resize(0.5); + + circle1.draw(); + circle2.draw(); + } + + // Implementor: 定义绘制图形的接口 + interface DrawingAPI { + void drawCircle(double x, double y, double radius); + } + + // ConcreteImplementor: 屏幕绘制实现 + static class DrawingAPI1 implements DrawingAPI { + @Override + public void drawCircle(double x, double y, double radius) { + System.out.println("Drawing Circle on Screen: (" + x + ", " + y + ") with radius " + radius); + } + } + + // ConcreteImplementor: 打印机绘制实现 + static class DrawingAPI2 implements DrawingAPI { + @Override + public void drawCircle(double x, double y, double radius) { + System.out.println("Drawing Circle on Printer: (" + x + ", " + y + ") with radius " + radius); + } + } + + // Abstraction: 定义图形接口 + static abstract class Shape { + protected DrawingAPI drawingAPI; + + protected Shape(DrawingAPI drawingAPI) { + this.drawingAPI = drawingAPI; + } + + public abstract void draw(); + + public abstract void resize(double factor); + } + + // RefinedAbstraction: 圆形 + static class Circle extends Shape { + private final double x; + private final double y; + private double radius; + + public Circle(double x, double y, double radius, DrawingAPI drawingAPI) { + super(drawingAPI); + this.x = x; + this.y = y; + this.radius = radius; + } + + @Override + public void draw() { + drawingAPI.drawCircle(x, y, radius); + } + + @Override + public void resize(double factor) { + radius *= factor; + } + } +} diff --git a/pattern/src/main/java/cn/bunny/pattern20/VisitorDemo.java b/pattern/src/main/java/cn/bunny/pattern20/VisitorDemo.java new file mode 100644 index 0000000..64d05c7 --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern20/VisitorDemo.java @@ -0,0 +1,65 @@ +package cn.bunny.pattern20; + +import java.util.Random; + +public class VisitorDemo { + public static void main(String[] args) { + } + + // 访问者 + interface Visitor { + void visit(Visitor visitor); + } + + // 员工抽象 + static abstract class Employee { + public String name; + public int kpi; + + public Employee(String name) { + this.name = name; + this.kpi = new Random().nextInt(10); + } + + // 接受访问者访问 + public abstract void accept(Visitor visitor); + } + + static class Engineer extends Employee { + + public Engineer(String name) { + super(name); + } + + /** + * @param visitor 访问者 + */ + @Override + public void accept(Visitor visitor) { + visitor.visit(visitor); + } + + public int getCodeLines() { + return new Random().nextInt(10000); + } + } + + static class Manger extends Employee { + + public Manger(String name) { + super(name); + } + + /** + * @param visitor 访问者 + */ + @Override + public void accept(Visitor visitor) { + visitor.visit(visitor); + } + + public int getProducts() { + return new Random().nextInt(10); + } + } +} diff --git a/pattern/src/main/java/cn/bunny/pattern20/VisitorDemo1.java b/pattern/src/main/java/cn/bunny/pattern20/VisitorDemo1.java new file mode 100644 index 0000000..1201ed6 --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern20/VisitorDemo1.java @@ -0,0 +1,150 @@ +package cn.bunny.pattern20; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class VisitorDemo1 { + public static void main(String[] args) { + BusinessReport report = new BusinessReport(); + System.out.println("-------------------CEO-------------------"); + report.showReport(new CEOVisitor()); + + System.out.println("-------------------CTO-------------------"); + report.showReport(new CTOVisitor()); + } + + // 访问者 + interface Visitor { + /** + * 访问者-工程师 + */ + void visit(Engineer engineer); + + /** + * 访问者-经理 + */ + void visit(Manger manger); + } + + // 具体访问者-CEO + static class CEOVisitor implements Visitor { + + /** + * 访问者-工程师 + * + * @param engineer 工程师 + */ + @Override + public void visit(Engineer engineer) { + System.out.println("工程师:" + engineer.name + ",KPI:" + engineer.kpi); + } + + /** + * 访问者-经理 + * + * @param manger 经理 + */ + @Override + public void visit(Manger manger) { + System.out.println("经理:" + manger.name + ",KPI:" + manger.kpi); + } + } + + // 具体访问者-CTO + static class CTOVisitor implements Visitor { + + /** + * 访问者-工程师 + * + * @param engineer 工程师 + */ + @Override + public void visit(Engineer engineer) { + System.out.println("工程师:" + engineer.name + ",代码行数:" + engineer.getCodeLines()); + } + + /** + * 访问者-经理 + * + * @param manger 经理 + */ + @Override + public void visit(Manger manger) { + System.out.println("经理:" + manger.name + ",产品数:" + manger.getProducts()); + } + } + + // 员工抽象 + static abstract class Employee { + public String name; + public int kpi; + + public Employee(String name) { + this.name = name; + this.kpi = new Random().nextInt(10); + } + + // 接受访问者访问 + public abstract void accept(Visitor visitor); + } + + // 员工具体---工程师 + static class Engineer extends Employee { + + public Engineer(String name) { + super(name); + } + + /** + * @param visitor 访问者 + */ + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } + + public int getCodeLines() { + return new Random().nextInt(10000); + } + } + + // 员工具体---经理 + static class Manger extends Employee { + + public Manger(String name) { + super(name); + } + + /** + * @param visitor 访问者 + */ + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } + + public int getProducts() { + return new Random().nextInt(10); + } + } + + // 员工报表类 + static class BusinessReport { + private final List employeeList = new ArrayList<>(); + + public BusinessReport() { + employeeList.add(new Manger("经理-A")); + employeeList.add(new Manger("经理-B")); + employeeList.add(new Manger("经理-C")); + employeeList.add(new Manger("经理-D")); + employeeList.add(new Manger("经理-E")); + } + + public void showReport(Visitor visitor) { + for (Employee employee : employeeList) { + employee.accept(visitor); + } + } + } +} \ No newline at end of file