From 1c8c2a958ea3e1b92d2d0faec2067a49d5448db6 Mon Sep 17 00:00:00 2001 From: Bunny <1319900154@qq.com> Date: Tue, 4 Feb 2025 18:23:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=8A=B6=E6=80=81=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../设计模式-v2/image-20250204181749629.png | Bin 0 -> 30292 bytes README/设计模式-v2.md | 267 +++++++++++++++++- .../java/cn/bunny/pattern14/Composite.java | 2 +- .../main/java/cn/bunny/pattern15/Client.java | 14 + .../pattern15/state/ClosingLiftState.java | 39 +++ .../java/cn/bunny/pattern15/state/Lift.java | 40 +++ .../cn/bunny/pattern15/state/LiftState.java | 28 ++ .../pattern15/state/OpeningLiftState.java | 36 +++ .../pattern15/state/RunningLiftState.java | 36 +++ .../pattern15/state/StoppingLiftState.java | 37 +++ 10 files changed, 495 insertions(+), 4 deletions(-) create mode 100644 README/images/设计模式-v2/image-20250204181749629.png create mode 100644 pattern/src/main/java/cn/bunny/pattern15/Client.java create mode 100644 pattern/src/main/java/cn/bunny/pattern15/state/ClosingLiftState.java create mode 100644 pattern/src/main/java/cn/bunny/pattern15/state/Lift.java create mode 100644 pattern/src/main/java/cn/bunny/pattern15/state/LiftState.java create mode 100644 pattern/src/main/java/cn/bunny/pattern15/state/OpeningLiftState.java create mode 100644 pattern/src/main/java/cn/bunny/pattern15/state/RunningLiftState.java create mode 100644 pattern/src/main/java/cn/bunny/pattern15/state/StoppingLiftState.java diff --git a/README/images/设计模式-v2/image-20250204181749629.png b/README/images/设计模式-v2/image-20250204181749629.png new file mode 100644 index 0000000000000000000000000000000000000000..cffec9f84e7d6fd1e5e28258d3f667b631ff23a3 GIT binary patch literal 30292 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
  • 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 literal 0 HcmV?d00001 diff --git a/README/设计模式-v2.md b/README/设计模式-v2.md index 715b1d0..5fe51fa 100644 --- a/README/设计模式-v2.md +++ b/README/设计模式-v2.md @@ -21,9 +21,9 @@ ### 工厂模式的主要角色 1. **产品接口(Product)**:通常是一个接口或者抽象类,定义了具体产品的公共方法。 -2. **具体产品(ConcreteProduct)**:实现了产品接口的具体类,代表不同的产品。 +2. **具体产品(Concrete Product)**:实现了产品接口的具体类,代表不同的产品。 3. **工厂接口(Creator)**:通常是一个抽象类或接口,定义了一个工厂方法用于创建产品。 -4. **具体工厂(ConcreteCreator)**:实现了工厂接口的具体类,负责创建具体的产品对象。 +4. **具体工厂(Concrete Creator)**:实现了工厂接口的具体类,负责创建具体的产品对象。 ### 工厂模式的类型 @@ -1858,7 +1858,268 @@ public class BakeDemo { --- -## 状态模式---行为型2 +## 状态模式---行为型 + +![image-20250204181749629](./images/设计模式-v2/image-20250204181749629.png) + +需要角色:状态对象(Context)、状态接口(State)、具体状态实现(Concrete State) + +### 简单示例 + +#### 示例代码 + +**上下文对象** + +```java +@Getter +public class Lift { + // 开门状态 + public static LiftState OPEN_STATE = new OpeningLiftState(); + // 关门状态 + public static LiftState CLOSE_STATE = new ClosingLiftState(); + // 运行状态 + public static LiftState RUNNING_STATE = new RunningLiftState(); + // 停止状态 + public static LiftState STOPPING_STATE = new StoppingLiftState(); + + // 当前电梯状态 + private LiftState currentLiftState; + + public void setCurrentLiftState(LiftState currentState) { + this.currentLiftState = currentState; + // 执行开门动作 + this.currentLiftState.lift = this; + } + + public void open() { + currentLiftState.open(); + } + + public void close() { + currentLiftState.close(); + } + + public void run() { + currentLiftState.run(); + } + + public void stop() { + currentLiftState.stop(); + } +} +``` + +**抽象状态接口** + +```java +@Setter +abstract class LiftState { + protected Lift lift; + + /** + * 开门动作 + */ + public abstract void open(); + + /** + * 关门动作 + */ + public abstract void close(); + + /** + * 运行动作 + */ + public abstract void run(); + + /** + * 停止动作 + */ + public abstract void stop(); +} +``` + +**开门状态---具体状态实现** + +```java +public class OpeningLiftState extends LiftState { + /** + * 开门动作 + */ + @Override + public void open() { + System.out.println("电梯门慢慢打开。。。"); + } + + /** + * 关门动作 + */ + @Override + public void close() { + super.lift.setCurrentLiftState(Lift.CLOSE_STATE); + super.lift.getCurrentLiftState().close(); + } + + /** + * 运行动作 + */ + @Override + public void run() { + + } + + /** + * 停止动作 + */ + @Override + public void stop() { + + } +} +``` + +**关门状态---具体状态实现** + +```java +public class ClosingLiftState extends LiftState { + /** + * 开门动作 + */ + @Override + public void open() { + super.lift.setCurrentLiftState(Lift.OPEN_STATE); + super.lift.getCurrentLiftState().open(); + } + + /** + * 关门动作 + */ + @Override + public void close() { + System.out.println("电梯关门。。。"); + } + + /** + * 运行动作 + */ + @Override + public void run() { + super.lift.setCurrentLiftState(Lift.RUNNING_STATE); + super.lift.getCurrentLiftState().run(); + } + + /** + * 停止动作 + */ + @Override + public void stop() { + super.lift.setCurrentLiftState(Lift.STOPPING_STATE); + super.lift.getCurrentLiftState().stop(); + } +} +``` + +**运行状态---具体状态实现** + +```java +public class RunningLiftState extends LiftState { + /** + * 开门动作 + */ + @Override + public void open() { + + } + + /** + * 关门动作 + */ + @Override + public void close() { + + } + + /** + * 运行动作 + */ + @Override + public void run() { + System.out.println("电梯正在运行。。。"); + } + + /** + * 停止动作 + */ + @Override + public void stop() { + super.lift.setCurrentLiftState(Lift.STOPPING_STATE); + super.lift.getCurrentLiftState().stop(); + } +} +``` + +**停止状态---具体状态实现** + +```java +public class StoppingLiftState extends LiftState { + /** + * 开门动作 + */ + @Override + public void open() { + super.lift.setCurrentLiftState(Lift.OPEN_STATE); + super.lift.getCurrentLiftState().open(); + } + + /** + * 关门动作 + */ + @Override + public void close() { + + } + + /** + * 运行动作 + */ + @Override + public void run() { + super.lift.setCurrentLiftState(Lift.RUNNING_STATE); + super.lift.getCurrentLiftState().run(); + } + + /** + * 停止动作 + */ + @Override + public void stop() { + System.out.println("电梯停止。。。"); + } +} +``` + +#### 运行结果 + +**当运行时** + +```java +public class Client { + public static void main(String[] args) { + Lift lift = new Lift(); + lift.setCurrentLiftState(Lift.RUNNING_STATE); + lift.open(); + lift.run(); + lift.close(); + lift.stop(); + } +} +``` + +**运行结果** + +```java +电梯正在运行。。。 +电梯停止。。。 +``` --- diff --git a/pattern/src/main/java/cn/bunny/pattern14/Composite.java b/pattern/src/main/java/cn/bunny/pattern14/Composite.java index a888643..d32f0fa 100644 --- a/pattern/src/main/java/cn/bunny/pattern14/Composite.java +++ b/pattern/src/main/java/cn/bunny/pattern14/Composite.java @@ -6,7 +6,7 @@ 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("上海华东分公司")); diff --git a/pattern/src/main/java/cn/bunny/pattern15/Client.java b/pattern/src/main/java/cn/bunny/pattern15/Client.java new file mode 100644 index 0000000..5508d71 --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern15/Client.java @@ -0,0 +1,14 @@ +package cn.bunny.pattern15; + +import cn.bunny.pattern15.state.Lift; + +public class Client { + public static void main(String[] args) { + Lift lift = new Lift(); + lift.setCurrentLiftState(Lift.RUNNING_STATE); + lift.open(); + lift.run(); + lift.close(); + lift.stop(); + } +} diff --git a/pattern/src/main/java/cn/bunny/pattern15/state/ClosingLiftState.java b/pattern/src/main/java/cn/bunny/pattern15/state/ClosingLiftState.java new file mode 100644 index 0000000..5df3b01 --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern15/state/ClosingLiftState.java @@ -0,0 +1,39 @@ +package cn.bunny.pattern15.state; + + +public class ClosingLiftState extends LiftState { + /** + * 开门动作 + */ + @Override + public void open() { + super.lift.setCurrentLiftState(Lift.OPEN_STATE); + super.lift.getCurrentLiftState().open(); + } + + /** + * 关门动作 + */ + @Override + public void close() { + System.out.println("电梯关门。。。"); + } + + /** + * 运行动作 + */ + @Override + public void run() { + super.lift.setCurrentLiftState(Lift.RUNNING_STATE); + super.lift.getCurrentLiftState().run(); + } + + /** + * 停止动作 + */ + @Override + public void stop() { + super.lift.setCurrentLiftState(Lift.STOPPING_STATE); + super.lift.getCurrentLiftState().stop(); + } +} diff --git a/pattern/src/main/java/cn/bunny/pattern15/state/Lift.java b/pattern/src/main/java/cn/bunny/pattern15/state/Lift.java new file mode 100644 index 0000000..61c72ba --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern15/state/Lift.java @@ -0,0 +1,40 @@ +package cn.bunny.pattern15.state; + +import lombok.Getter; + +@Getter +public class Lift { + // 开门状态 + public static LiftState OPEN_STATE = new OpeningLiftState(); + // 关门状态 + public static LiftState CLOSE_STATE = new ClosingLiftState(); + // 运行状态 + public static LiftState RUNNING_STATE = new RunningLiftState(); + // 停止状态 + public static LiftState STOPPING_STATE = new StoppingLiftState(); + + // 当前电梯状态 + private LiftState currentLiftState; + + public void setCurrentLiftState(LiftState currentState) { + this.currentLiftState = currentState; + // 执行开门动作 + this.currentLiftState.lift = this; + } + + public void open() { + currentLiftState.open(); + } + + public void close() { + currentLiftState.close(); + } + + public void run() { + currentLiftState.run(); + } + + public void stop() { + currentLiftState.stop(); + } +} \ No newline at end of file diff --git a/pattern/src/main/java/cn/bunny/pattern15/state/LiftState.java b/pattern/src/main/java/cn/bunny/pattern15/state/LiftState.java new file mode 100644 index 0000000..167e056 --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern15/state/LiftState.java @@ -0,0 +1,28 @@ +package cn.bunny.pattern15.state; + +import lombok.Setter; + +@Setter +abstract class LiftState { + protected Lift lift; + + /** + * 开门动作 + */ + public abstract void open(); + + /** + * 关门动作 + */ + public abstract void close(); + + /** + * 运行动作 + */ + public abstract void run(); + + /** + * 停止动作 + */ + public abstract void stop(); +} \ No newline at end of file diff --git a/pattern/src/main/java/cn/bunny/pattern15/state/OpeningLiftState.java b/pattern/src/main/java/cn/bunny/pattern15/state/OpeningLiftState.java new file mode 100644 index 0000000..0695f0e --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern15/state/OpeningLiftState.java @@ -0,0 +1,36 @@ +package cn.bunny.pattern15.state; + +public class OpeningLiftState extends LiftState { + /** + * 开门动作 + */ + @Override + public void open() { + System.out.println("电梯门慢慢打开。。。"); + } + + /** + * 关门动作 + */ + @Override + public void close() { + super.lift.setCurrentLiftState(Lift.CLOSE_STATE); + super.lift.getCurrentLiftState().close(); + } + + /** + * 运行动作 + */ + @Override + public void run() { + + } + + /** + * 停止动作 + */ + @Override + public void stop() { + + } +} diff --git a/pattern/src/main/java/cn/bunny/pattern15/state/RunningLiftState.java b/pattern/src/main/java/cn/bunny/pattern15/state/RunningLiftState.java new file mode 100644 index 0000000..16b5fca --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern15/state/RunningLiftState.java @@ -0,0 +1,36 @@ +package cn.bunny.pattern15.state; + +public class RunningLiftState extends LiftState { + /** + * 开门动作 + */ + @Override + public void open() { + + } + + /** + * 关门动作 + */ + @Override + public void close() { + + } + + /** + * 运行动作 + */ + @Override + public void run() { + System.out.println("电梯正在运行。。。"); + } + + /** + * 停止动作 + */ + @Override + public void stop() { + super.lift.setCurrentLiftState(Lift.STOPPING_STATE); + super.lift.getCurrentLiftState().stop(); + } +} diff --git a/pattern/src/main/java/cn/bunny/pattern15/state/StoppingLiftState.java b/pattern/src/main/java/cn/bunny/pattern15/state/StoppingLiftState.java new file mode 100644 index 0000000..9412d75 --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern15/state/StoppingLiftState.java @@ -0,0 +1,37 @@ +package cn.bunny.pattern15.state; + +public class StoppingLiftState extends LiftState { + /** + * 开门动作 + */ + @Override + public void open() { + super.lift.setCurrentLiftState(Lift.OPEN_STATE); + super.lift.getCurrentLiftState().open(); + } + + /** + * 关门动作 + */ + @Override + public void close() { + + } + + /** + * 运行动作 + */ + @Override + public void run() { + super.lift.setCurrentLiftState(Lift.RUNNING_STATE); + super.lift.getCurrentLiftState().run(); + } + + /** + * 停止动作 + */ + @Override + public void stop() { + System.out.println("电梯停止。。。"); + } +}