English 简体中文 繁體中文 한국 사람 日本語 Deutsch русский بالعربية TÜRKÇE português คนไทย french
查看: 1|回复: 0

设计模式学习:2、状态模式实现订单状态流转

[复制链接]
查看: 1|回复: 0

设计模式学习:2、状态模式实现订单状态流转

[复制链接]
查看: 1|回复: 0

365

主题

0

回帖

1105

积分

金牌会员

积分
1105
jdin043

365

主题

0

回帖

1105

积分

金牌会员

积分
1105
5 天前 | 显示全部楼层 |阅读模式
支付场景中的状态流转

在开发电商支付模块时,我们常遇到这样的状态流转需求:

  • 订单需要经历 待支付 → 支付中 → 支付成功/失败 → 退款处理 的完整生命周期。
  • 不同状态下可执行的操作不同(例如只有支付成功才能退款)。
  • 状态转换需要触发附加操作(支付成功要发通知、更新库存)。
传统的 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();  // 进入ProcessingStateorder.RequestRefund();   // 输出警告信息// 模拟支付成功回调order.TransitionTo(new PaidState());order.RequestRefund();   // 进入RefundingState相关代码:https://github.com/huangmingji/design-pattern-learning/tree/main/design-pattern-learning-2
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

365

主题

0

回帖

1105

积分

金牌会员

积分
1105

QQ|智能设备 | 粤ICP备2024353841号-1

GMT+8, 2025-3-11 03:05 , Processed in 7.883477 second(s), 27 queries .

Powered by 智能设备

©2025

|网站地图