登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
博客
发1篇日志+1圆
记录
发1条记录+2圆币
发帖说明
VIP申请
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
VIP申请
VIP网盘
网盘
联系我们
道具
勋章
任务
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
设计模式学习:状态模式实现订单状态流转 ...
设计模式学习:状态模式实现订单状态流转
[ 复制链接 ]
志灿隐
2025-6-1 23:35:53
支付场景中的状态流转
在开发电商支付模块时,我们常遇到这样的状态流转需求:
订单需要经历 待支付 → 支付中 → 支付成功/失败 → 退款处理 的完整生命周期。
不同状态下可执行的操作不同(例如只有支付成功才能退款)。
状态转换需要触发附加操作(支付成功要发通知、更新库存)。
传统的 if-else 或 switch 实现方式会导致:
代码臃肿,维护困难
状态转换逻辑分散
新增状态需要修改大量现有代码
此时,状态模式(State Pattern)是这些问题的最佳解决方案。
状态模式核心思想
通过将状态抽象为独立类,实现两大关键特性:
行为状态化 :不同状态下相同的操作产生不同结果
转换自动化 :状态对象自行决定下一个状态
状态模式实现
状态接口设计
// 订单状态抽象接口
public interface IOrderState
{
void Process(OrderContext context);
void Cancel(OrderContext context);
void Refund(OrderContext context);
}
// 订单上下文(维护当前状态)
public class OrderContext
{
private IOrderState _currentState;
public string OrderId { get; } = Guid.NewGuid().ToString();
public OrderContext(IOrderState initialState)
{
TransitionTo(initialState);
}
public void TransitionTo(IOrderState state)
{
Console.WriteLine($"订单状态变更:{_currentState?.GetType().Name} → {state.GetType().Name}");
_currentState = state;
}
public void ProcessPayment() => _currentState.Process(this);
public void CancelOrder() => _currentState.Cancel(this);
public void RequestRefund() => _currentState.Refund(this);
}
复制代码
具体状态类实现
待支付状态:
public class PendingState : IOrderState
{
public void Process(OrderContext context)
{
Console.WriteLine("开始支付处理...");
// 调用支付网关接口
context.TransitionTo(new ProcessingState());
}
public void Cancel(OrderContext context)
{
Console.WriteLine("订单已取消");
context.TransitionTo(new CanceledState());
}
public void Refund(OrderContext context)
{
Console.WriteLine("待支付订单不能退款");
throw new InvalidOperationException("待支付订单不能退款");
}
}
复制代码
支付中状态:
public class ProcessingState : IOrderState
{
public void Process(OrderContext context)
{
Console.WriteLine("支付处理中...");
context.TransitionTo(new PaidState());
}
public void Cancel(OrderContext context)
{
Console.WriteLine("支付处理中,不可取消订单...");
throw new InvalidOperationException("支付处理中,不可取消订单...");
}
public void Refund(OrderContext context)
{
Console.WriteLine("支付未完成不能退款");
throw new InvalidOperationException("支付未完成不能退款");
}
}
复制代码
支付成功状态:
public class PaidState : IOrderState
{
public void Process(OrderContext context)
{
Console.WriteLine("订单已完成支付");
throw new InvalidOperationException("订单已完成支付");
}
public void Cancel(OrderContext context)
{
Console.WriteLine("已支付订单需走退款流程");
throw new InvalidOperationException("已支付订单需走退款流程");
}
public void Refund(OrderContext context)
{
Console.WriteLine("发起退款申请...");
// 调用退款接口
context.TransitionTo(new RefundingState());
}
}
复制代码
退款中状态:
public class RefundingState : IOrderState
{
public void Process(OrderContext context)
{
Console.WriteLine("退款处理中...");
context.TransitionTo(new RefundedState());
}
public void Cancel(OrderContext context)
{
Console.WriteLine("退款处理中,不可取消订单...");
throw new InvalidOperationException("退款处理中,不可取消订单...");
}
public void Refund(OrderContext context)
{
Console.WriteLine("退款处理中,不可重复退款");
throw new InvalidOperationException("退款处理中,不可重复退款");
}
}
复制代码
退款完成状态:
public class RefundedState : IOrderState
{
public void Process(OrderContext context)
{
Console.WriteLine("退款完成,订单已取消");
throw new InvalidOperationException("退款完成,订单已取消");
}
public void Cancel(OrderContext context)
{
Console.WriteLine("订单已退款,无需取消");
throw new InvalidOperationException("订单已退款,无需取消");
}
public void Refund(OrderContext context)
{
Console.WriteLine("订单已退款,无需退款");
throw new InvalidOperationException("订单已退款,无需退款");
}
}
复制代码
订单取消状态:
public class CanceledState : IOrderState
{
public void Process(OrderContext context)
{
Console.WriteLine("订单已取消,无需支付");
throw new InvalidOperationException("订单已取消,无需支付");
}
public void Cancel(OrderContext context)
{
Console.WriteLine("订单已取消,无需取消");
throw new InvalidOperationException("订单已取消,无需取消");
}
public void Refund(OrderContext context)
{
Console.WriteLine("订单已取消,无需退款");
throw new InvalidOperationException("订单已取消,无需退款");
}
}
复制代码
完整状态流转示例
var order = new OrderContext(new PendingState());
order.ProcessPayment(); // 进入ProcessingState
order.RequestRefund(); // 输出警告信息
// 模拟支付成功回调
order.TransitionTo(new PaidState());
order.RequestRefund(); // 进入RefundingState
复制代码
相关代码:https://github.com/huangmingji/design-pattern-learning/tree/main/design-pattern-learning-2
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
状态
设计模式
学习
模式
实现
相关帖子
CMake构建学习笔记23-SQLite库的构建
在富文本编辑器中实现 Markdown 流式增量解析算法
设计模式之单例模式
彩笔运维勇闯机器学习--逻辑回归
使用Java实现一个DNS服务
CMake构建学习笔记24-使用通用脚本构建PROJ和GEOS
CMake构建学习笔记25-SpatiaLite库的构建
WPF依赖属性学习
GitPod 使用 SpiceDB 实现权限管理
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
CMake构建学习笔记23-SQLite库的构建
0
418
涣爹卮
2025-09-02
业界
在富文本编辑器中实现 Markdown 流式增量解析算法
0
250
柄利
2025-09-03
安全
设计模式之单例模式
0
60
颖顿庐
2025-09-03
业界
彩笔运维勇闯机器学习--逻辑回归
0
862
琦谓
2025-09-03
安全
使用Java实现一个DNS服务
0
132
秦晓曼
2025-09-03
业界
CMake构建学习笔记24-使用通用脚本构建PROJ和GEOS
0
686
左丘平莹
2025-09-03
业界
CMake构建学习笔记25-SpatiaLite库的构建
0
90
虽裘侪
2025-09-04
业界
WPF依赖属性学习
0
95
诉称
2025-09-04
业界
GitPod 使用 SpiceDB 实现权限管理
0
960
事值
2025-09-04
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
志灿隐
2025-6-1 23:35:53
关注
0
粉丝关注
15
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9984
黎瑞芝
9990
杭环
9988
4
凶契帽
9988
5
氛疵
9988
6
猷咎
9986
7
接快背
9986
8
里豳朝
9986
9
肿圬后
9986
10
段干叶农
9986
查看更多