(二十一)、设计模式 之 状态模式(State)
(二十一)、设计模式 之 状态模式(State)
1、简介
定义: 状态模式是一种行为型设计模式。它允许对象在内部状态发生改变时改变它的行为,简单地讲就是,一个拥有状态的context对象,在不同状态下,其行为会发生改变。状态和行为是一一对应的(如果处于A状态,就拥有A状态所拥有的行为和操作),状态之间可以相互转换。
2、状态模式结构说明
- 抽象状态(AbstractState):抽象状态(Abstract State):抽象状态类是所有具体状态类的基类或接口。负责定义该状态下的行为,可以一个或多个。
- 具体状态(ConcreteState):是具体状态角色,根据自身的状态来实现State接口的方法。
- 上下文(Context):用于维护State实例, 根据state的不同,实例对应的ConcreteState类也不同。
3、状态的选择与实现
- ①可以在当前状态的实现中维护下一个状态的实现。参考责任链模式的设计。
- ②可以在数据库中存储当前状态的下一个状态是什么,然后使用反射创建下一个状态的具体实现。
4、实现代码
/**
* @Author dw
* @ClassName AbstractState
* @Description 抽象状态
* @Date 2023/12/19 17:20
* @Version 1.0
*/
public abstract class AbstractState {
/**
* 可以在当前类中持有下一个状态
*/
protected AbstractState nextState;
public AbstractState (AbstractState nextState) {
this.nextState = nextState;
}
/**
* 当前状态对应的抽象行为
*/
protected abstract void operation();
}
/**
* @Author dw
* @ClassName ConcreteState
* @Description 具体状态
* @Date 2023/12/19 17:20
* @Version 1.0
*/
public class ConcreteState extends AbstractState {
public ConcreteState(AbstractState nextState) {
super(nextState);
if (nextState == this) {
throw new RuntimeException("存在循环引用!");
}
}
/**
* 当前状态对应的抽象行为
*/
@Override
protected void operation() {
System.out.println("执行具体的状态处理逻辑");
}
}
/**
* @Author dw
* @ClassName Context
* @Description 上下文
* @Date 2023/12/19 17:20
* @Version 1.0
*/
public class Context {
/**
* 持有一个状态行为处理对象
*/
private final AbstractState state;
public Context (AbstractState state) {
this.state = state;
}
/**
* 执行当前状态的具体逻辑
*/
public void someOperation () {
// 执行当前状态处理操作
state.operation();
// 当前状态处理完成之后,继续执行后面状态的操作
if (Objects.nonNull(state.nextState)) {
state.nextState.operation();
}
}
}
4、状态模式的应用场景
- 当一个对象的行为取决于其内部状态,并且在不同状态下具有不同的行为时。
- 当对象的行为在运行时需要根据其状态动态改变,并且需要避免大量的条件语句和分支判断时。
- 当代码中存在大量的条件语句和分支逻辑,并且这些逻辑与对象的状态变化相关时。
- 当对象的状态之间存在复杂的转换关系,并且需要维护状态转换的一致性时。
5、状态模式的优缺点
优点
- 客户端只需要与上下文对象进行交互,而不需要了解具体状态对象的切换和行为实现细节。
- 避免了使用大量的条件语句来控制对象在不同状态下的行为。它将状态相关的代码分散到各个具体状态类中,使代码更加清晰、可读性更高,易于维护和扩展。
缺点
- 状态模式要求状态之间的变化有强的依赖关系, 必须掌握全部的状态,以及各个状态的流向。在中间环节新增状态,可能需要修改代码。
- 状态的配置避免出现循环调用。
6、状态模式与策略模式的区别
可以发现状态模式和策略模式的代码结构一致。但这两种模式的应用场景是不一样的。策略模式的多种算法行为选择一种就能满足,彼此之间是独立的;而状态模式中各个状态间存在相互关系。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)