From 21f806f2063e591aa75d5204e3fba2318fc4cb19 Mon Sep 17 00:00:00 2001 From: Bunny <1319900154@qq.com> Date: Sun, 2 Feb 2025 21:22:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B4=A3=E4=BB=BB=E9=93=BE=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F-=E6=9C=AA=E5=AE=8C=E6=88=90=E3=80=82=E3=80=82?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../设计模式-v2/image-20250201205232542.png | Bin 0 -> 20401 bytes .../设计模式-v2/image-20250201205350467.png | Bin 0 -> 13065 bytes .../设计模式-v2/image-20250202201204954.png | Bin 0 -> 15191 bytes README/设计模式-v2.md | 278 +++++++++++++++++- .../cn/bunny/pattern5/demo3/CommandDemo.java | 146 ++------- .../cn/bunny/pattern5/demo4/BakeDemo.java | 99 +++++++ .../java/cn/bunny/pattern6/BuilderDemo.java | 146 +++++++++ .../java/cn/bunny/pattern7/demo1/Chain.java | 69 +++++ 8 files changed, 613 insertions(+), 125 deletions(-) create mode 100644 README/images/设计模式-v2/image-20250201205232542.png create mode 100644 README/images/设计模式-v2/image-20250201205350467.png create mode 100644 README/images/设计模式-v2/image-20250202201204954.png create mode 100644 pattern/src/main/java/cn/bunny/pattern5/demo4/BakeDemo.java create mode 100644 pattern/src/main/java/cn/bunny/pattern6/BuilderDemo.java create mode 100644 pattern/src/main/java/cn/bunny/pattern7/demo1/Chain.java diff --git a/README/images/设计模式-v2/image-20250201205232542.png b/README/images/设计模式-v2/image-20250201205232542.png new file mode 100644 index 0000000000000000000000000000000000000000..a051b2bd0263d65fdf77ec1070b10a5250dae472 GIT binary patch literal 20401 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 literal 0 HcmV?d00001 diff --git a/README/images/设计模式-v2/image-20250201205350467.png b/README/images/设计模式-v2/image-20250201205350467.png new file mode 100644 index 0000000000000000000000000000000000000000..cc13a988a27ee6ec17dc6e66e09233afec630bea GIT binary patch literal 13065 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 literal 0 HcmV?d00001 diff --git a/README/设计模式-v2.md b/README/设计模式-v2.md index 27f6720..e222a6c 100644 --- a/README/设计模式-v2.md +++ b/README/设计模式-v2.md @@ -479,7 +479,190 @@ public class CameraDemo { **Client**:客户端,负责创建并配置命令对象,将命令与接收者绑定,并传递给调用者执行。 +### 简单示例 +![image-20250201205350467](./images/设计模式-v2/image-20250201205350467.png) + +#### 示例代码 + +```java +public class CommandDemo { + public static void main(String[] args) { + Receiver receiver = new Receiver(); + + ConcreteCommand concreteCommand = new ConcreteCommand(receiver); + + Invoker invoker = new Invoker(); + invoker.setCommand(concreteCommand); + invoker.invoke(); + } + + // 命令接口 + interface Command { + + /** + * 执行方法 + */ + void execute(); + } + + // 接受者 + static class Receiver { + public void action() { + System.out.println("接受者 执行。。。"); + } + } + + // 具体的执行命令 + static class ConcreteCommand implements Command { + + private final Receiver receiver; + + public ConcreteCommand(Receiver receiver) { + this.receiver = receiver; + } + + /** + * 执行方法 + */ + @Override + public void execute() { + receiver.action(); + } + } + + @Setter + static class Invoker { + private Command command; + + public void invoke() { + command.execute(); + } + } +} +``` + +#### 执行结果: + +```java +接受者 执行。。。 +``` + +### 示例-烧烤店 + +![image-20250201205232542](./images/设计模式-v2/image-20250201205232542.png) + + + +#### 示例代码 + +```java +public class BakeDemo { + + // 充当客户端 + public static void main(String[] args) { + Waiter waiter = new Waiter(); + Barbecue barbecue = new Barbecue(); + + waiter.addCommand(new BakeChickenWing(barbecue)); + waiter.addCommand(new BakeMutton(barbecue)); + + waiter.notifyCommand(); + } + + // 接受者-厨师 + static class Barbecue { + + /** + * 烤串 + */ + public void bakeMutton() { + System.out.println("开始烤串。。。"); + } + + /** + * 烤鸡翅 + */ + public void bakeChickenWing() { + System.out.println("开始烤鸡翅。。。"); + } + } + + // 请求者-invoker-服务员 + public static class Waiter { + private final List commandList = new ArrayList<>(); + + public void addCommand(Command command) { + commandList.add(command); + } + + /** + * 通知厨师开始制作 + */ + public void notifyCommand() { + for (Command command : commandList) { + command.execute(); + } + } + } + + public static abstract class Command { + protected Barbecue barbecue; + + public Command(Barbecue barbecue) { + this.barbecue = barbecue; + } + + /** + * 执行方法 + */ + public abstract void execute(); + } + + // 命令-烤鸡翅 + public static class BakeChickenWing extends Command { + + public BakeChickenWing(Barbecue barbecue) { + super(barbecue); + } + + /** + * 执行方法 + */ + @Override + public void execute() { + barbecue.bakeChickenWing(); + } + } + + // 命令-烤串 + public static class BakeMutton extends Command { + + public BakeMutton(Barbecue barbecue) { + super(barbecue); + } + + /** + * 执行方法 + */ + @Override + public void execute() { + barbecue.bakeMutton(); + } + } +} +``` + +#### 执行结果: + +```java +开始烤鸡翅。。。 +开始烤串。。。 +``` + +--- + +## 工厂模式 --- @@ -536,11 +719,6 @@ public class Singleton { - 在低并发环境或单线程环境下,懒汉模式使用较为简单,不会有多线程安全问题。 - 对于高并发且需要频繁访问单例的场景,推荐使用**静态内部类**或**饿汉模式**来避免懒汉模式可能带来的性能问题。 -#### 总结 - -懒汉模式有时为了延迟初始化而牺牲了性能,特别是在多线程环境下。为了保证线程安全,可以采用双重检查锁定(DCL)或静态内部类的方式,而**静态内部类方式是最推荐的方式** -,它避免了同步开销,同时也能确保线程安全。 - - **优点**: 1. 延迟加载,节省资源。 2. 内存优化,只有在需要时才实例化。 @@ -579,8 +757,6 @@ public class Singleton { - **实例化不耗费太多资源**:如果单例对象的初始化过程非常轻量级且无须延迟初始化,可以使用饿汉模式。 - **类加载顺序固定**:如果不在乎单例对象在启动时是否初始化,且单例对象的初始化过程没有严重性能损失,可以选择饿汉模式。 -#### 总结 - - **优点**:简单、线程安全、性能高(没有锁机制)、实现方便。 - **缺点**:不支持延迟加载、可能会浪费资源(如果单例对象不常用时)。 @@ -775,7 +951,7 @@ public class CommandDemo { } ``` -#### 运行结果 +#### 运行结果: ```java CommandDemo.Computer(CPU=Low CPU, RAM=Low RAM, hardDrive=Low Driver) @@ -785,3 +961,89 @@ CommandDemo.Computer(CPU=Low CPU, RAM=Low RAM, hardDrive=Low Driver) CommandDemo.Computer(CPU=High CPU, RAM=High RAM, hardDrive=High Driver) ``` +## 责任链模式-未完成。。。 + +主要有两个角色:抽象处理者(Handler)、具体处理者(ConcreteHandler) + +![image-20250202201204954](./images/设计模式-v2/image-20250202201204954.png) + +### 简单示例 + +#### 代码示例 + +```java +public class Chain { + + // 过滤垃圾请求,为了演示需要清除【垃圾,辣鸡,腊鸡】这些词 + public static void main(String[] args) { + Handler handlerA = new ConcreteHandlerA(); + Handler handlerB = new ConcreteHandlerB(); + Handler handlerC = new ConcreteHandlerC(); + + // 设置责任链 + handlerA.setNextHandler(handlerB); + handlerB.setNextHandler(handlerC); + + // 发起请求 + handlerA.handleRequest("过滤垃圾请求,为了演示需要清除【垃圾,辣鸡,腊鸡】这些词"); + } + + // ConcreteHandler类 + static class ConcreteHandlerA extends Handler { + @Override + public void handleRequest(String request) { + // 处理"垃圾" + String updatedRequest = request.replaceAll("垃圾", ""); + System.out.println("Handler A处理后: " + updatedRequest); + + if (nextHandler != null) { + nextHandler.handleRequest(updatedRequest); // 传递修改后的请求 + } + } + } + + static class ConcreteHandlerB extends Handler { + @Override + public void handleRequest(String request) { + // 处理"辣鸡" + String updatedRequest = request.replaceAll("辣鸡", ""); + System.out.println("Handler B处理后: " + updatedRequest); + + if (nextHandler != null) { + nextHandler.handleRequest(updatedRequest); // 传递修改后的请求 + } + } + } + + static class ConcreteHandlerC extends Handler { + @Override + public void handleRequest(String request) { + // 处理"腊鸡" + String updatedRequest = request.replaceAll("腊鸡", ""); + System.out.println("Handler C处理后: " + updatedRequest); + + if (nextHandler != null) { + nextHandler.handleRequest(updatedRequest); // 传递修改后的请求 + } + } + } + + // Handler类 + @Setter + abstract static class Handler { + protected Handler nextHandler; + + public abstract void handleRequest(String request); + } +} +``` + +#### 运行结果: + +```java +Handler A处理后: 过滤请求,为了演示需要清除【,辣鸡,腊鸡】这些词 +Handler B处理后: 过滤请求,为了演示需要清除【,,腊鸡】这些词 +Handler C处理后: 过滤请求,为了演示需要清除【,,】这些词 +``` + +### diff --git a/pattern/src/main/java/cn/bunny/pattern5/demo3/CommandDemo.java b/pattern/src/main/java/cn/bunny/pattern5/demo3/CommandDemo.java index dc57cdf..9aa7c63 100644 --- a/pattern/src/main/java/cn/bunny/pattern5/demo3/CommandDemo.java +++ b/pattern/src/main/java/cn/bunny/pattern5/demo3/CommandDemo.java @@ -1,146 +1,58 @@ package cn.bunny.pattern5.demo3; -import lombok.Data; +import lombok.Setter; public class CommandDemo { public static void main(String[] args) { - ConcreteLowComputerBuilder concreteLowComputerBuilder = new ConcreteLowComputerBuilder(); - Director director = new Director(concreteLowComputerBuilder); - director.constructComputer(); - System.out.println(concreteLowComputerBuilder.getComputer()); + Receiver receiver = new Receiver(); - System.out.println("\n-----------------分割线-----------------\n"); - - ConcreteHighComputerBuilder concreteHighComputerBuilder = new ConcreteHighComputerBuilder(); - director = new Director(concreteHighComputerBuilder); - director.constructComputer(); - System.out.println(concreteHighComputerBuilder.getComputer()); + ConcreteCommand concreteCommand = new ConcreteCommand(receiver); + + Invoker invoker = new Invoker(); + invoker.setCommand(concreteCommand); + invoker.invoke(); } - // 构建产品接口 - interface ComputerBuilder { + // 命令接口 + interface Command { /** - * 构建 CPU 方法 + * 执行方法 */ - void buildCPU(); - - /** - * 构建 RAM 方法 - */ - void buildRAM(); - - /** - * 构建 磁盘 方法 - */ - void buildHardDrive(); - - /** - * 返回产品 - * - * @return Computer - */ - Computer getComputer(); + void execute(); } - // 产品类 - @Data - static class Computer { - private String CPU; - private String RAM; - private String hardDrive; - } - - // 构建低端产品 - static class ConcreteLowComputerBuilder implements ComputerBuilder { - private final Computer computer = new Computer(); - - /** - * 构建 CPU 方法 - */ - @Override - public void buildCPU() { - computer.setCPU("Low CPU"); - } - - /** - * 构建 RAM 方法 - */ - @Override - public void buildRAM() { - computer.setRAM("Low RAM"); - } - - /** - * 构建 磁盘 方法 - */ - @Override - public void buildHardDrive() { - computer.setHardDrive("Low Driver"); - } - - /** - * 返回产品 - * - * @return Computer - */ - @Override - public Computer getComputer() { - return computer; + // 接受者 + static class Receiver { + public void action() { + System.out.println("接受者 执行。。。"); } } - // 构建高端产品 - static class ConcreteHighComputerBuilder implements ComputerBuilder { - private final Computer computer = new Computer(); + // 具体的执行命令 + static class ConcreteCommand implements Command { - /** - * 构建 CPU 方法 - */ - @Override - public void buildCPU() { - computer.setCPU("High CPU"); + private final Receiver receiver; + + public ConcreteCommand(Receiver receiver) { + this.receiver = receiver; } /** - * 构建 RAM 方法 + * 执行方法 */ @Override - public void buildRAM() { - computer.setRAM("High RAM"); - } - - /** - * 构建 磁盘 方法 - */ - @Override - public void buildHardDrive() { - computer.setHardDrive("High Driver"); - } - - /** - * 返回产品 - * - * @return Computer - */ - @Override - public Computer getComputer() { - return computer; + public void execute() { + receiver.action(); } } - // 构建者 - public static class Director { - private final ComputerBuilder builder; + @Setter + static class Invoker { + private Command command; - public Director(ComputerBuilder builder) { - this.builder = builder; - } - - public void constructComputer() { - builder.buildCPU(); - builder.buildRAM(); - builder.buildHardDrive(); + public void invoke() { + command.execute(); } } } diff --git a/pattern/src/main/java/cn/bunny/pattern5/demo4/BakeDemo.java b/pattern/src/main/java/cn/bunny/pattern5/demo4/BakeDemo.java new file mode 100644 index 0000000..55921c1 --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern5/demo4/BakeDemo.java @@ -0,0 +1,99 @@ +package cn.bunny.pattern5.demo4; + +import java.util.ArrayList; +import java.util.List; + +public class BakeDemo { + + // 充当客户端 + public static void main(String[] args) { + Waiter waiter = new Waiter(); + Barbecue barbecue = new Barbecue(); + + waiter.addCommand(new BakeChickenWing(barbecue)); + waiter.addCommand(new BakeMutton(barbecue)); + + waiter.notifyCommand(); + } + + // 接受者-厨师 + static class Barbecue { + + /** + * 烤串 + */ + public void bakeMutton() { + System.out.println("开始烤串。。。"); + } + + /** + * 烤鸡翅 + */ + public void bakeChickenWing() { + System.out.println("开始烤鸡翅。。。"); + } + } + + // 请求者-invoker-服务员 + public static class Waiter { + private final List commandList = new ArrayList<>(); + + public void addCommand(Command command) { + commandList.add(command); + } + + /** + * 通知厨师开始制作 + */ + public void notifyCommand() { + for (Command command : commandList) { + command.execute(); + } + } + } + + public static abstract class Command { + protected Barbecue barbecue; + + public Command(Barbecue barbecue) { + this.barbecue = barbecue; + } + + /** + * 执行方法 + */ + public abstract void execute(); + } + + // 命令-烤鸡翅 + public static class BakeChickenWing extends Command { + + public BakeChickenWing(Barbecue barbecue) { + super(barbecue); + } + + /** + * 执行方法 + */ + @Override + public void execute() { + barbecue.bakeChickenWing(); + } + } + + // 命令-烤串 + public static class BakeMutton extends Command { + + public BakeMutton(Barbecue barbecue) { + super(barbecue); + } + + /** + * 执行方法 + */ + @Override + public void execute() { + barbecue.bakeMutton(); + } + } +} diff --git a/pattern/src/main/java/cn/bunny/pattern6/BuilderDemo.java b/pattern/src/main/java/cn/bunny/pattern6/BuilderDemo.java new file mode 100644 index 0000000..7a6287c --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern6/BuilderDemo.java @@ -0,0 +1,146 @@ +package cn.bunny.pattern6; + +import lombok.Data; + +public class BuilderDemo { + public static void main(String[] args) { + ConcreteLowComputerBuilder concreteLowComputerBuilder = new ConcreteLowComputerBuilder(); + Director director = new Director(concreteLowComputerBuilder); + director.constructComputer(); + System.out.println(concreteLowComputerBuilder.getComputer()); + + System.out.println("\n-----------------分割线-----------------\n"); + + ConcreteHighComputerBuilder concreteHighComputerBuilder = new ConcreteHighComputerBuilder(); + director = new Director(concreteHighComputerBuilder); + director.constructComputer(); + System.out.println(concreteHighComputerBuilder.getComputer()); + } + + // 构建产品接口 + interface ComputerBuilder { + + /** + * 构建 CPU 方法 + */ + void buildCPU(); + + /** + * 构建 RAM 方法 + */ + void buildRAM(); + + /** + * 构建 磁盘 方法 + */ + void buildHardDrive(); + + /** + * 返回产品 + * + * @return Computer + */ + Computer getComputer(); + } + + // 产品类 + @Data + static class Computer { + private String CPU; + private String RAM; + private String hardDrive; + } + + // 构建低端产品 + static class ConcreteLowComputerBuilder implements ComputerBuilder { + private final Computer computer = new Computer(); + + /** + * 构建 CPU 方法 + */ + @Override + public void buildCPU() { + computer.setCPU("Low CPU"); + } + + /** + * 构建 RAM 方法 + */ + @Override + public void buildRAM() { + computer.setRAM("Low RAM"); + } + + /** + * 构建 磁盘 方法 + */ + @Override + public void buildHardDrive() { + computer.setHardDrive("Low Driver"); + } + + /** + * 返回产品 + * + * @return Computer + */ + @Override + public Computer getComputer() { + return computer; + } + } + + // 构建高端产品 + static class ConcreteHighComputerBuilder implements ComputerBuilder { + private final Computer computer = new Computer(); + + /** + * 构建 CPU 方法 + */ + @Override + public void buildCPU() { + computer.setCPU("High CPU"); + } + + /** + * 构建 RAM 方法 + */ + @Override + public void buildRAM() { + computer.setRAM("High RAM"); + } + + /** + * 构建 磁盘 方法 + */ + @Override + public void buildHardDrive() { + computer.setHardDrive("High Driver"); + } + + /** + * 返回产品 + * + * @return Computer + */ + @Override + public Computer getComputer() { + return computer; + } + } + + // 构建者 + public static class Director { + private final ComputerBuilder builder; + + public Director(ComputerBuilder builder) { + this.builder = builder; + } + + public void constructComputer() { + builder.buildCPU(); + builder.buildRAM(); + builder.buildHardDrive(); + } + } +} diff --git a/pattern/src/main/java/cn/bunny/pattern7/demo1/Chain.java b/pattern/src/main/java/cn/bunny/pattern7/demo1/Chain.java new file mode 100644 index 0000000..5e39e23 --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern7/demo1/Chain.java @@ -0,0 +1,69 @@ +package cn.bunny.pattern7.demo1; + +import lombok.Setter; + +public class Chain { + + // 过滤垃圾请求,为了演示需要清除【垃圾,辣鸡,腊鸡】这些词 + public static void main(String[] args) { + Handler handlerA = new ConcreteHandlerA(); + Handler handlerB = new ConcreteHandlerB(); + Handler handlerC = new ConcreteHandlerC(); + + // 设置责任链 + handlerA.setNextHandler(handlerB); + handlerB.setNextHandler(handlerC); + + // 发起请求 + handlerA.handleRequest("过滤垃圾请求,为了演示需要清除【垃圾,辣鸡,腊鸡】这些词"); + } + + // ConcreteHandler类 + static class ConcreteHandlerA extends Handler { + @Override + public void handleRequest(String request) { + // 处理"垃圾" + String updatedRequest = request.replaceAll("垃圾", ""); + System.out.println("Handler A处理后: " + updatedRequest); + + if (nextHandler != null) { + nextHandler.handleRequest(updatedRequest); // 传递修改后的请求 + } + } + } + + static class ConcreteHandlerB extends Handler { + @Override + public void handleRequest(String request) { + // 处理"辣鸡" + String updatedRequest = request.replaceAll("辣鸡", ""); + System.out.println("Handler B处理后: " + updatedRequest); + + if (nextHandler != null) { + nextHandler.handleRequest(updatedRequest); // 传递修改后的请求 + } + } + } + + static class ConcreteHandlerC extends Handler { + @Override + public void handleRequest(String request) { + // 处理"腊鸡" + String updatedRequest = request.replaceAll("腊鸡", ""); + System.out.println("Handler C处理后: " + updatedRequest); + + if (nextHandler != null) { + nextHandler.handleRequest(updatedRequest); // 传递修改后的请求 + } + } + } + + // Handler类 + @Setter + abstract static class Handler { + protected Handler nextHandler; + + public abstract void handleRequest(String request); + } +} +