设计模式学习:1、在支付系统中的实战应用

一、策略模式:灵活切换支付方式

场景需求

系统需要支持支付宝、微信支付、银联等多种支付渠道,且可能随时新增支付方式。

模式实现

  1. 定义支付策略接口
csharp 复制代码
public interface IPaymentStrategy 
{
    void ProcessPayment(decimal amount, string currency);
}
  1. 实现具体支付策略类
csharp 复制代码
// 支付宝策略
public class AlipayStrategy : IPaymentStrategy
{
    public void ProcessPayment(decimal amount, string currency)
    {
        Console.WriteLine($"支付宝支付:{amount}{currency}");
        // 调用支付宝SDK实现
    }
}

// 微信支付策略(实现类似)
public class WechatPayStrategy : IPaymentStrategy { /*...*/ }
  1. 创建支付上下文类
csharp 复制代码
public class PaymentContext
{
    private IPaymentStrategy _strategy;

    public void SetStrategy(IPaymentStrategy strategy) => _strategy = strategy;
    
    public void ExecutePayment(decimal amount, string currency) 
    {
        _strategy.ProcessPayment(amount, currency);
    }
}

二、装饰器模式:动态扩展支付功能

场景需求

为支付流程添加日志记录、风控验证等附加功能。

模式实现

csharp 复制代码
public abstract class PaymentDecorator : IPaymentStrategy
{
    protected IPaymentStrategy _strategy;

    public PaymentDecorator(IPaymentStrategy strategy)
    {
        _strategy = strategy;
    }

    public virtual void ProcessPayment(decimal amount, string currency)
    {
        _strategy.ProcessPayment(amount, currency);
    }
}

// 日志装饰器
public class LoggingDecorator : PaymentDecorator
{
    public LoggingDecorator(IPaymentStrategy strategy) : base(strategy) {}

    public override void ProcessPayment(decimal amount, string currency)
    {
        Console.WriteLine($"[LOG] 支付请求:{amount}{currency}");
        base.ProcessPayment(amount, currency);
    }
}

public class RiskCheckDecorator : PaymentDecorator
{
    public RiskCheckDecorator(IPaymentStrategy strategy) : base(strategy) {}
    public override void ProcessPayment(decimal amount, string currency)
    {
        Console.WriteLine("[RISK] 风控验证中...");
        base.ProcessPayment(amount, currency);
    }
}

// 使用示例
var payment = new LoggingDecorator(new RiskCheckDecorator(new AlipayStrategy()));
payment.ProcessPayment(100, "CNY");

三、工厂模式:统一支付对象创建

场景需求

根据配置参数动态创建支付策略实例。

模式实现

bash 复制代码
public class PaymentFactory
{
    public static IPaymentStrategy Create(string paymentType)
    {
        switch (paymentType.ToLower())
        {
            case "alipay":
                return new AlipayStrategy();
            case "wechat":
                return new WechatPayStrategy();
            case "unionpay":
                return new UnionPayStrategy();
            default:
                throw new ArgumentException("不支持的支付方式");
        }
    }
}

// 调用示例
var strategy = PaymentFactory.Create("alipay");
strategy.ProcessPayment(200, "USD");

四、责任链模式:支付流程处理

场景需求

处理支付请求时需要依次执行:参数校验 → 风控检查 → 实际支付 → 结果通知。

模式实现

csharp 复制代码
public abstract class PaymentHandler
{
    protected PaymentHandler _nextHandler;
    
    public PaymentHandler SetNext(PaymentHandler handler) 
    {
        _nextHandler = handler;
        return _nextHandler;
    }

    public abstract void Handle(PaymentRequest request);
}

// 参数校验处理器
public class ValidationHandler : PaymentHandler
{
    public override void Handle(PaymentRequest request)
    {
        if (string.IsNullOrEmpty(request.OrderId))
            throw new ArgumentException("订单号无效");
        
        _nextHandler?.Handle(request);
    }
}

// 构建处理链
var chain = new ValidationHandler();
chain.SetNext(new RiskCheckHandler())
     .SetNext(new PaymentProcessorHandler())
     .SetNext(new NotificationHandler());
chain.Handle(request);

五、综合应用示例

  1. 定义支付策略接口
csharp 复制代码
public interface IPaymentStrategy 
{
    void ProcessPayment(decimal amount, string currency);
}
  1. 实现具体支付策略类
csharp 复制代码
// 支付宝策略
public class AlipayStrategy : IPaymentStrategy
{
    public void ProcessPayment(decimal amount, string currency)
    {
        Console.WriteLine($"支付宝支付:{amount}{currency}");
        // 调用支付宝SDK实现
    }
}

// 微信支付策略(实现类似)
public class WechatPayStrategy : IPaymentStrategy { /*...*/ }

// 银联支付策略(实现类似)
public class UnionPayStrategy : IPaymentStrategy { /*...*/ }
  1. 创建支付请求类
csharp 复制代码
public class PaymentFactory
{
    public static IPaymentStrategy Create(string paymentType)
    {
        switch (paymentType.ToLower())
        {
            case "alipay":
                return new AlipayStrategy();
            case "wechat":
                return new WechatPayStrategy();
            case "unionpay":
                return new UnionPayStrategy();
            default:
                throw new ArgumentException("不支持的支付方式");
        }
    }
}
  1. 创建支付装饰类
csharp 复制代码
public abstract class PaymentDecorator : IPaymentStrategy
{
    protected IPaymentStrategy _strategy;

    public PaymentDecorator(IPaymentStrategy strategy)
    {
        _strategy = strategy;
    }

    public virtual void ProcessPayment(decimal amount, string currency)
    {
        _strategy.ProcessPayment(amount, currency);
    }
}

// 日志装饰器
public class LoggingDecorator : PaymentDecorator
{
    public LoggingDecorator(IPaymentStrategy strategy) : base(strategy) {}

    public override void ProcessPayment(decimal amount, string currency)
    {
        Console.WriteLine($"[LOG] 支付请求:{amount}{currency}");
        base.ProcessPayment(amount, currency);
    }
}
  1. 创建支付上下文类
csharp 复制代码
public class PaymentContext
{
    private IPaymentStrategy _strategy;

    public void SetStrategy(IPaymentStrategy strategy) => _strategy = strategy;
    
    public void ExecutePayment(decimal amount, string currency) 
    {
        new LoggingDecorator(_strategy).ProcessPayment(amount, currency);
    }
}
  1. 创建支付处理链类
csharp 复制代码
public abstract class PaymentHandler
{
    protected PaymentHandler _nextHandler;
    
    public PaymentHandler SetNext(PaymentHandler handler) 
    {
        _nextHandler = handler;
        return _nextHandler;
    }

    public abstract void Handle(PaymentRequest request);
}

// 参数校验处理器
public class ValidationHandler : PaymentHandler
{
    public override void Handle(PaymentRequest request)
    {
        if (string.IsNullOrEmpty(request.OrderId))
            throw new ArgumentException("订单号无效");
        
        _nextHandler?.Handle(request);
    }
}

// 风控检查处理器
public class RiskCheckHandler : PaymentHandler
{
    public override void Handle(PaymentRequest request)
    {
        Console.WriteLine("[RISK] 风控验证中...");
        _nextHandler?.Handle(request);
    }
}

// 支付结果通知处理器
public class NotificationHandler : PaymentHandler
{
    public override void Handle(PaymentRequest request)
    {
        Console.WriteLine($"支付结果通知:{request.OrderId}");
        _nextHandler?.Handle(request);
    }
}

// 实际支付处理器
public class PaymentProcessorHandler : PaymentHandler
{
    public override void Handle(PaymentRequest request)
    {
        Console.WriteLine($"[PAYMENT] 实际支付:{request.Amount}{request.Currency}");
        var strategy = PaymentFactory.Create(request.PaymentType);
        PaymentContext context = new PaymentContext();
        context.SetStrategy(strategy);
        context.ExecutePayment(request.Amount, request.Currency);
        _nextHandler?.Handle(request);
    }
}

// 构建处理链
var chain = new ValidationHandler();
chain.SetNext(new RiskCheckHandler())
     .SetNext(new PaymentProcessorHandler())
     .SetNext(new NotificationHandler());
chain.Handle(request);

相关代码:github.com/huangmingji...

相关推荐
这是谁的博客?8 小时前
微服务架构设计模式深度解析:从拆分策略到容灾机制
微服务·设计模式·云原生·架构·架构设计·后端开发·分布式系统
fan_music11 小时前
设计模式学习
c++·设计模式
乐观的山里娃13 小时前
【后编码时代 06】Vibe Coding + Superpowers 完全不够
设计模式·软件工程·ai编程
likerhood14 小时前
设计模式 · 责任链模式(Chain of Responsibility Pattern)
设计模式·责任链模式
追烽少年x17 小时前
STL中的设计模式(一)
c++·设计模式
乐观的山里娃17 小时前
【设计模式 10】抽象工厂:整体换季
设计模式
贵慜_Derek19 小时前
《从零实现 Agent 系统》连载 08|编排与工作流:从 Chat 到任务图
人工智能·设计模式·架构
W.W.H.20 小时前
C++ 设计模式:6 个常用模式的实战示例
开发语言·c++·设计模式
老码观察20 小时前
设计模式实战解读(三):模板方法模式——骨架复用与扩展点设计
设计模式·模板方法模式
雪度娃娃20 小时前
行为型设计模式——状态模式
ui·设计模式·状态模式