惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Hackread – Cybersecurity News, Data Breaches, AI and More
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
V2EX
T
The Blog of Author Tim Ferriss
腾讯CDC
Hugging Face - Blog
Hugging Face - Blog
雷峰网
雷峰网
爱范儿
爱范儿
GbyAI
GbyAI
H
Help Net Security
I
InfoQ
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
人人都是产品经理
人人都是产品经理
J
Java Code Geeks
Microsoft Security Blog
Microsoft Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
N
Netflix TechBlog - Medium
Last Week in AI
Last Week in AI
宝玉的分享
宝玉的分享
云风的 BLOG
云风的 BLOG
Project Zero
Project Zero
P
Privacy & Cybersecurity Law Blog
A
Arctic Wolf
Know Your Adversary
Know Your Adversary
G
Google Developers Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Tor Project blog
V
Vulnerabilities – Threatpost
Y
Y Combinator Blog
WordPress大学
WordPress大学
V
Visual Studio Blog
博客园_首页
G
GRAHAM CLULEY
K
Kaspersky official blog
T
Tailwind CSS Blog
T
Threat Research - Cisco Blogs
博客园 - Franky
D
Docker
Security Latest
Security Latest
I
Intezer
有赞技术团队
有赞技术团队
Application and Cybersecurity Blog
Application and Cybersecurity Blog
博客园 - 【当耐特】
B
Blog RSS Feed
T
The Exploit Database - CXSecurity.com
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

博客园 - 黄明基

解剖一个桌面级 AI Copilot 的架构:Stargazer AI Copilot(.NET 10 + Avalonia)是怎么“分层”的 StargazerLab Copilot使用说明 🚀 用 .NET + Avalonia 打造你的专属 AI Copilot 桌面端 分布式应用框架Microsoft Orleans - 7、基于 Microsoft Orleans 构建模块化微服务:用户、消息与存储三大核心模块解析 Semantic Kernel人工智能开发 - 第六章:Semantic Kernel的安全与过滤器机制——构建可信赖的AI应用防护体系 Semantic Kernel人工智能开发 - 第五章:提示词工程与模板优化——释放大语言模型真正潜力 Semantic Kernel人工智能开发 - 第四章:Semantic Kernel内存管理系统——为AI注入持久记忆与上下文感知能力 Semantic Kernel人工智能开发 - 第三章:Semantic Kernel插件系统详解——扩展AI能力的核心引擎 Semantic Kernel人工智能开发 - 第二章:环境搭建与第一个AI应用——从零开始构建智能对话系统 Semantic Kernel人工智能开发 - 第一章:Semantic Kernel框架概览——开启智能应用开发之门 结合.NET Aspire与Spring Boot:构建可观测的云原生Java应用 分布式应用框架Microsoft Orleans - 6、构建高可用Orleans应用:集群配置与容灾机制详解 分布式应用框架Microsoft Orleans - 5、掌握Orleans高级特性:计时器、提醒与流处理详解 分布式应用框架Microsoft Orleans - 4、掌握Microsoft Orleans状态管理:从持久化配置到事务处理 分布式应用框架Microsoft Orleans - 3、深入解析Orleans核心要素:Grain与Silo的工作原理 分布式应用框架Microsoft Orleans - 2、动手实践:构建你的第一个Microsoft Orleans应用程序 分布式应用框架Microsoft Orleans - 1、Microsoft Orleans简介 AI真的太好用啦!Aspire Dashboard集成GitHub Copilot。 智能助手客户端 设计模式学习:在支付系统中的实战应用 跨平台桌面应用开发:解锁 Electron 与 shadcn/ui 的潜力 构建你的.NET Aspire解决方案
设计模式学习:状态模式实现订单状态流转
黄明基 · 2025-03-06 · via 博客园 - 黄明基

支付场景中的状态流转

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

  • 订单需要经历 待支付支付中支付成功/失败退款处理 的完整生命周期。
  • 不同状态下可执行的操作不同(例如只有支付成功才能退款)。
  • 状态转换需要触发附加操作(支付成功要发通知、更新库存)。

传统的 if-elseswitch 实现方式会导致:

  • 代码臃肿,维护困难
  • 状态转换逻辑分散
  • 新增状态需要修改大量现有代码

此时,状态模式(State Pattern)是这些问题的最佳解决方案。

状态模式核心思想

通过将状态抽象为独立类,实现两大关键特性:

  1. 行为状态化 :不同状态下相同的操作产生不同结果
  2. 转换自动化 :状态对象自行决定下一个状态

状态模式实现

  1. 状态接口设计
// 订单状态抽象接口
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);
}
  1. 具体状态类实现
    待支付状态:
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