掌握设计模式--状态模式
创作时间:
作者:
@小白创作中心
掌握设计模式--状态模式
引用
1
来源
1.
https://www.cnblogs.com/dennyLee2025/p/18793902
状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为,看起来像是改变了其类。这种模式通常用于解决对象在运行时状态多变且行为复杂的问题。
核心思想
将状态与行为绑定,每种状态对应一个具体类有独立的行为逻辑,状态的切换只需更换状态对象,并且状态流转在行为逻辑中完成。
主要组成部分
- Context(上下文):持有当前状态的对象,负责将请求委托给当前状态对象处理。
- State(抽象状态):定义一个接口,封装具体状态对象的行为。
- ConcreteState(具体状态):实现具体状态对应的行为,每个状态对应对象的一个行为。
案例实现
假设我们开发了一个简单的文档审批工作流系统,包括以下状态:
- 草稿(Draft):文档创建后初始状态,可编辑。
- 提交(Submitted):文档已提交,等待审批。
- 审批通过(Approved):文档被批准,不可再修改。
- 驳回(Rejected):文档被驳回,可重新编辑并提交。
案例类图
状态接口
public interface State {
void handle(Context context);
}
具体状态
一种状态对应一个具体类,实现不同的行为逻辑,在行为中流转到下一种状态。
// 草稿状态
public class DraftState implements State {
@Override
public void handle(Context context) {
System.out.println("当前状态: 草稿状态 >>> 提交文档...");
context.setState(new SubmittedState());
}
}
// 提交状态
public class SubmittedState implements State {
@Override
public void handle(Context context) {
System.out.println("当前状态: 提交状态 >>> 审批通过 or 审批驳回...");
// 模拟审批结果
if (Math.random() > 0.5) {
System.out.println("文档审批通过");
context.setState(new ApprovedState());
} else {
System.out.println("文档审批驳回");
context.setState(new RejectedState());
}
}
}
// 审批通过状态
public class ApprovedState implements State {
@Override
public void handle(Context context) {
System.out.println("当前状态: 审批通过 >>> 没有其他操作。");
}
}
// 驳回状态
public class RejectedState implements State {
@Override
public void handle(Context context) {
System.out.println("当前状态: 驳回状态 >>> 重新编辑并提交文档...");
context.setState(new DraftState());
}
}
上下文类
状态的流程由上下文类来完成
public class Context {
private State state;
public Context(State state) {
this.state = state;
}
public void setState(State state) {
this.state = state;
}
public void request() {
state.handle(this);
}
}
测试代码
public class WorkflowStateDemo {
public static void main(String[] args) {
Context context = new Context(new DraftState());
// 模拟多次状态变化
for (int i = 0; i < 5; i++) {
context.request();
}
}
}
运行结果
每次运行的结果可能不同,因为模拟了随机审批结果:
当前状态: 草稿状态 >>> 提交文档...
当前状态: 提交状态 >>> 审批通过 or 审批驳回...
文档审批驳回
当前状态: 驳回状态 >>> 重新编辑并提交文档...
当前状态: 草稿状态 >>> 提交文档...
当前状态: 提交状态 >>> 审批通过 or 审批驳回...
文档审批通过
或
当前状态: 草稿状态 >>> 提交文档...
当前状态: 提交状态 >>> 审批通过 or 审批驳回...
文档审批通过
当前状态: 审批通过 >>> 没有其他操作。
当前状态: 审批通过 >>> 没有其他操作。
当前状态: 审批通过 >>> 没有其他操作。
扩展状态:可以扩展为更多状态,例如“待修改”、“归档”等,只需要增加具体状态类及状态流转的调整即可。
优缺点和适用场景
优点
- 状态切换清晰:每个状态封装了特定行为,便于管理。
- 代码维护性好:避免了大量的 if-else 或 switch 语句。
- 遵循开闭原则:添加新状态时无需修改现有代码。
缺点
- 状态类增多:每个状态需要一个具体类,可能导致类的数量增加。
- 状态切换复杂:需要在状态中显式定义状态转换逻辑。
适用场景
- 对象的行为取决于状态,且需要在运行时根据状态改变行为。
- 替代 if-else 或 switch 语句处理状态逻辑,避免代码复杂性和维护困难。
- 状态之间的切换清晰明确、状态转换简单且固定。
总结
状态模式有点像策略模式,最大的不同是,状态类维护着状态的流转。状态模式是一种通过将对象的行为与其状态分离,使对象在不同状态下表现出不同行为的设计模式。在状态中需要显式定义状态转换逻辑,状态模式的显式状态转换逻辑适用于状态数量有限、关系明确、行为独立的场景,但在状态复杂、依赖上下文或需要动态控制的情况下,应该引入更灵活的设计方式(如状态机或规则引擎)来简化管理。可以结合具体业务需求,权衡模式的适用性和实现复杂度,选择最合适的方案。
本文原文来自Cnblogs
热门推荐
如何安全取消银行卡自动扣款?
现代婚姻现角色转变新趋势:专家支招应对挑战
2岁宝宝坐飞机可以吗?有什么注意事项?2岁宝宝首次飞行全攻略
秋冬脱皮救星:芦荟胶了解一下?
维生素A/B族缺乏,脸部脱皮怎么办?
粉条里有没有明胶,打火机烧一烧就知道,再也不怕买到假粉条
北方水城发力氢能产业,迁安迎来新机遇
以人为本,兼听纳谏:唐太宗的治国智慧
不伤羽绒、方便快捷,干洗慕斯成冬季清洁新选择
橙黄决明素的药效活性与肝毒性研究进展
冬季护肤神器:中医食疗大揭秘
蒸鸡蛋:考试季考生的营养助力
创意蒸鸡蛋,让你秒变厨神!
三个关键技巧教你蒸出完美鸡蛋羹
价值61万的阿什拉领衔,全球十大名贵猫咪图鉴
法律禁止+生存环境限制,专家:水獭不应被当宠物
陈乔恩6天减6斤背后:极低能量膳食的利与弊
高职旅游管理推行双证书制,毕业生就业率显著提升
专家解读:如何与青春期女儿建立良好沟通
理解与引导:助力青春期女儿独立成长
斗地主 vs 德州扑克:社交神器大PK
斗地主 vs 德州扑克:谁才是策略之王?
从自我觉醒到拒绝内耗:一本书教你如何为自己撑腰
白芷香砂仁炖鸡,让你秒变大厨
鸡腿汤怎么炖最有营养?这些方法和技巧让你轻松掌握
信任与创新双轮驱动,大陆集团构建多元包容企业文化
摆脱肤浅期待,建立真实情感联系
糖尿病高血压患者必做:ACR检测预防肾病
别轻视眼皮跳:可能是这些疾病信号,6招教你缓解
右下眼皮跳动怎么办?专家解析四大原因与对策