登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
每日签到
每天签到奖励2圆-6圆
发帖说明
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
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
状态
设计模式
学习
模式
实现
相关帖子
彩笔运维勇闯机器学习--决策树
TypeScript 队列实战:从零实现简单、循环、双端、优先队列,附完整测试代码
HarmonyOS实现快递APP自动识别地址
PHP实现国际短信验证码发送接口的完整指南
如何在 Unity3D 中实现无缝滚动动画?
彩笔运维勇闯机器学习--随机森林
关于寻找深度学习Baseline和IDEA的思考
如何用 vxe-table 实现2个树表格可以互相拖拽数据
iOS集成FaceAISDK实现人脸识别,活体检测
使用CalcBinding实现复杂逻辑绑定
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
彩笔运维勇闯机器学习--决策树
0
204
巨耗
2025-09-09
业界
TypeScript 队列实战:从零实现简单、循环、双端、优先队列,附完整测试代码
0
258
蓟晓彤
2025-09-09
业界
HarmonyOS实现快递APP自动识别地址
0
100
毡轩
2025-09-09
业界
PHP实现国际短信验证码发送接口的完整指南
0
929
任静柔
2025-09-09
安全
如何在 Unity3D 中实现无缝滚动动画?
0
804
劝匠注
2025-09-10
业界
彩笔运维勇闯机器学习--随机森林
0
563
空娅芬
2025-09-11
安全
关于寻找深度学习Baseline和IDEA的思考
0
118
迭婵椟
2025-09-11
代码
如何用 vxe-table 实现2个树表格可以互相拖拽数据
0
673
胰芰
2025-09-11
安全
iOS集成FaceAISDK实现人脸识别,活体检测
0
642
诈知
2025-09-11
业界
使用CalcBinding实现复杂逻辑绑定
0
635
缍米
2025-09-11
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
签约作者
程序园优秀签约作者
发帖
志灿隐
2025-6-1 23:35:53
关注
0
粉丝关注
15
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9984
杭环
9988
凶契帽
9988
4
氛疵
9988
5
黎瑞芝
9988
6
猷咎
9986
7
里豳朝
9986
8
肿圬后
9986
9
蝓俟佐
9984
10
虽裘侪
9984
查看更多