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

场景需求

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

模式实现

  1. 定义支付策略接口

    1
    2
    3
    4
    public interface IPaymentStrategy 
    {
    void ProcessPayment(decimal amount, string currency);
    }
  2. 实现具体支付策略类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // 支付宝策略
    public class AlipayStrategy : IPaymentStrategy
    {
    public void ProcessPayment(decimal amount, string currency)
    {
    Console.WriteLine($"支付宝支付:{amount}{currency}");
    // 调用支付宝SDK实现
    }
    }

    // 微信支付策略(实现类似)
    public class WechatPayStrategy : IPaymentStrategy { /*...*/ }
  3. 创建支付上下文类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class PaymentContext
    {
    private IPaymentStrategy _strategy;

    public void SetStrategy(IPaymentStrategy strategy) => _strategy = strategy;

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

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

场景需求

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

模式实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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");

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

场景需求

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

模式实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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");

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

场景需求

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

模式实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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. 定义支付策略接口

    1
    2
    3
    4
    public interface IPaymentStrategy 
    {
    void ProcessPayment(decimal amount, string currency);
    }
  2. 实现具体支付策略类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // 支付宝策略
    public class AlipayStrategy : IPaymentStrategy
    {
    public void ProcessPayment(decimal amount, string currency)
    {
    Console.WriteLine($"支付宝支付:{amount}{currency}");
    // 调用支付宝SDK实现
    }
    }

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

    // 银联支付策略(实现类似)
    public class UnionPayStrategy : IPaymentStrategy { /*...*/ }
  3. 创建支付请求类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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("不支持的支付方式");
    }
    }
    }
  4. 创建支付装饰类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    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);
    }
    }
  5. 创建支付上下文类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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);
    }
    }
  6. 创建支付处理链类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    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);

相关代码:https://github.com/huangmingji/design-pattern-learning/tree/main/design-pattern-learning-1