状态设计模式
- 🚩什么是状态设计模式?
- 🚩状态设计模式的特点
- 🚩状态设计模式的结构
- 🚩状态设计模式的优缺点
- 🚩状态设计模式的Java实现
- 🚩代码总结
- 🚩总结
🚩什么是状态设计模式?
状态设计模式(State Pattern) 是一种 行为型设计模式,它允许对象在 内部状态改变时改变其行为,看起来就像改变了它的类。
使用场景
-
有限状态机(如贩卖机、订单状态管理、流程控制等)
-
状态切换(如任务状态、权限控制、游戏角色状态等)
-
减少
if-else
逻辑,使代码更清晰
🚩状态设计模式的特点
-
封装状态:将状态封装为独立的类,使得状态切换更加清晰。
-
消除大量
if-else
语句,提高代码的可维护性。 -
状态与行为绑定,对象的行为取决于当前状态。
-
遵循开闭原则,增加新状态时无需修改已有代码。
🚩状态设计模式的结构
状态模式主要由以下角色组成:
-
Context(上下文)
:维护当前状态,并定义状态切换的方法。 -
State(状态接口)
:定义所有具体状态的公共接口。 -
ConcreteState(具体状态类)
:实现State
接口,并定义当前状态下的行为。
图例:
🚩状态设计模式的优缺点
✅ 优点
-
减少
if-else
语句,提高代码的可读性和可维护性。 -
状态变化时可以方便地扩展,符合 开闭原则。
-
将状态与具体行为解耦,使代码更清晰。
❌ 缺点
-
类的数量增加,每个状态都需要单独定义一个类。
-
如果状态过多,可能导致状态类泛滥。
🚩状态设计模式的Java实现
代码地址:GitHub
- 创建状态接口
State
/**
* @author hanso
* @description: 状态接口
* @date 2025-03-26 00:20:37
* @version: 1.0
*/
public interface State {
public void Handle(Context context);
}
-
定义两个具体的状态类型
StateA
和StateB
,StateA
表示有货,StateB
表示无货StateA
/** * @author hanso * @description: 状态A 有货 * @date 2025-03-26 00:22:37 * @version: 1.0 */ public class StateA implements State { // 有货 @Override public void Handle(Context context) { int count = context.getCount(); if (count >= 1) { System.out.println("购买成功!"); context.setCount(count - 1); if (context.getCount() == 0){ context.setState(new StateB()); } } else { System.out.println("购买失败!"); } } }
StateB
/** * @author hanso * @description: 状态B 无货 * @date 2025-03-26 00:24:22 * @version: 1.0 */ public class StateB implements State { // 无货 @Override public void Handle(Context context) { int count = context.getCount(); if (count == 0) { System.out.println("购买失败!等待补货"); context.setCount(5); System.out.println("补货成功,请重新购买"); context.setState(new StateA()); } } }
-
创建上下文
Context
/**
* @author hanso
* @description: 上下文
* @date 2025-03-26 00:21:08
* @version: 1.0
*/
public class Context {// 贩卖机
private int count;
private State state;
public Context() {
count = 3;
state = new StateA();
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void Request() { // 购买一个饮料
state.Handle(this);
}
}
- 测试状态设计模式
/**
* @author hanso
* @description: 测试状态模式
* @date 2025-03-26 00:25:38
* @version: 1.0
*/
public class StatePattern {
public static void main(String[] args) {
Context context = new Context(); // count:3
System.out.println(context.getState());
context.Request(); // 购买一个饮料 count = 2
context.Request(); // 购买一个饮料 count = 1
context.Request(); // 购买一个饮料 count = 0
System.out.println(context.getState());
context.Request(); // 无货 等待补货 补货成功 count = 5
System.out.println(context.getState());
context.Request(); // 购买一个饮料 count = 4
System.out.println(context.getCount());
}
}
📌 运行结果
🚩代码总结
-
Context(上下文)
负责维护当前状态,并根据状态调用不同的行为。 -
State(状态接口)
定义了所有具体状态需要实现的方法。 -
StateA 和 StateB(具体状态类)
定义了不同状态下的行为。 -
状态切换
发生在Handle()
方法中,当满足特定条件时,状态转换。
🚩总结
-
状态模式适用于有限状态机、任务管理等场景。
-
消除了 if-else 逻辑,使代码更加清晰。
-
状态变更时,只需新增状态类,不影响已有代码。
创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️