用户名
Email
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
应用中心
帖子
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
账号登录
立即注册
找回密码
用户名
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
数据库
›
分布式数据库
›
状态模式详解与真实场景案例(Java实现) ...
状态模式详解与真实场景案例(Java实现)
天空闲话
论坛元老
|
2025-4-18 17:47:06
|
显示全部楼层
|
阅读模式
楼主
主题
1784
|
帖子
1784
|
积分
5352
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
模式界说
状态模式(State Pattern) 允许对象在其内部状态改变时改变它的举动,使对象看起来像是修改了它的类。属于举动型设计模式,焦点思想是将状态抽象为独立对象,差异状态下举动封装在差异状态类中。
解决的问题
消除庞大的条件分支
避免对象在差异状态下使用大量if-else或switch-case判断状态
状态转换逻辑清晰化
将状态转移规则封装在状态对象中
进步扩展性
新增状态时只需添加新状态类,无需修改现有代码
真实场景案例:电商订单状态流转
需求配景
电商订单存在多种状态:
待支付 → 已支付 → 已发货 → 已收货 → 已完成
每个状态下可实验的操作差异:
待支付状态:允许支付、取消订单
已支付状态:允许发货、退款
已发货状态:允许确认收货
已收货状态:允许完成订单
已完成/已取消状态:不可再操作
代码实现
1. 界说状态接口
// 订单状态接口
public interface OrderState {
void pay(OrderContext context); // 支付
void cancel(OrderContext context); // 取消
void ship(OrderContext context); // 发货
void receive(OrderContext context); // 收货
void complete(OrderContext context); // 完成
}
复制代码
2. 实现详细状态类
待支付状态
public class UnpaidState implements OrderState {
@Override
public void pay(OrderContext context) {
System.out.println("支付成功");
context.setState(new PaidState());
}
@Override
public void cancel(OrderContext context) {
System.out.println("订单已取消");
context.setState(new CancelledState());
}
// 其他操作不支持
@Override
public void ship(OrderContext context) {
throw new UnsupportedOperationException("待支付状态不能发货");
}
@Override
public void receive(OrderContext context) {
throw new UnsupportedOperationException("非法操作");
}
@Override
public void complete(OrderContext context) {
throw new UnsupportedOperationException("非法操作");
}
}
复制代码
已支付状态
public class PaidState implements OrderState {
@Override
public void ship(OrderContext context) {
System.out.println("商品已发货");
context.setState(new ShippedState());
}
@Override
public void cancel(OrderContext context) {
System.out.println("发起退款流程");
context.setState(new CancelledState());
}
// 其他操作处理
@Override
public void pay(OrderContext context) {
throw new UnsupportedOperationException("已支付状态不能重复支付");
}
// ... 类似处理其他不支持操作
}
复制代码
其他状态类(已发货、已收货、已完成、已取消)实现方式类似,此处省略。
3. 界说订单上下文
public class OrderContext {
private OrderState currentState;
public OrderContext() {
this.currentState = new UnpaidState(); // 初始状态
}
public void setState(OrderState state) {
this.currentState = state;
}
// 委托操作给当前状态
public void pay() { currentState.pay(this); }
public void cancel() { currentState.cancel(this); }
public void ship() { currentState.ship(this); }
public void receive() { currentState.receive(this); }
public void complete() { currentState.complete(this); }
}
复制代码
4. 客户端使用
public class Client {
public static void main(String[] args) {
OrderContext order = new OrderContext();
order.pay(); // 正常支付
order.ship(); // 正常发货
order.receive(); // 正常收货
order.complete(); // 完成订单
try {
order.ship(); // 尝试非法操作
} catch (Exception e) {
System.out.println("操作失败: " + e.getMessage());
}
}
}
复制代码
输出结果
复制
支付乐成
商品已发货
确认收货乐成
订单已完成
操作失败: 已完成状态不能发货
模式上风
上风传统条件分支实现状态模式实现可维护性修改状态逻辑需改动大量条件判断只需修改对应状态类可扩展性新增状态需修改所有相干方法新增状态类即可代码清晰度一个方法包罗所有状态逻辑每个状态逻辑独立封装单一职责违反单一职责原则每个状态类职责明确
实际应用场景
工作流引擎
审批流程中的差异状态(起草、审批中、已通过、被驳回)
游戏开发
脚色状态(站立、移动、攻击、死亡)
硬件控制
电梯运行状态(制止、运行、故障)
UI交互
按钮的差异状态(正常、禁用、悬停、点击)
通过状态模式,我们实现了:
✅ 消除复杂的条件判断
✅ 状态转换逻辑内聚到状态类中
✅ 符合开闭原则(新增状态无需修改现有代码)
✅ 更易维护的清晰代码布局
一句话总结
状态模式就是将状态都独立出来,将状态与实际业务解耦。相对于策略模式,状态与状态之间有接洽,策略与策略之间是独立的。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
天空闲话
论坛元老
这个人很懒什么都没写!
楼主热帖
css过渡样式
Mysql终端Terminal操作
编程能力提升系列:1. 二维矩阵的最大 ...
【数据库】数据库课程设计一一疫苗接种 ...
C语言执行过程
Java EnumMap values()方法具有什么功 ...
罗景:连接效率优化实践
Kubernetes(K8S) Controller - Statefu ...
Cesium 案例(一) Z-Indexing Geometr ...
如何精简 Prometheus 的指标和存储占用 ...
标签云
国产数据库
集成商
AI
运维
CIO
存储
服务器
浏览过的版块
数据仓库与分析
IOS
云原生
快速回复
返回顶部
返回列表