设计模式学习:1、在支付系统中的实战应用
一、策略模式:灵活切换支付方式
场景需求
系统需要支持支付宝、微信支付、银联等多种支付渠道,且可能随时新增支付方式。
模式实现
定义支付策略接口
1
2
3
4public interface IPaymentStrategy
{
void ProcessPayment(decimal amount, string currency);
}实现具体支付策略类
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 { /*...*/ }创建支付上下文类
1
2
3
4
5
6
7
8
9
10
11public class PaymentContext
{
private IPaymentStrategy _strategy;
public void SetStrategy(IPaymentStrategy strategy) => _strategy = strategy;
public void ExecutePayment(decimal amount, string currency)
{
_strategy.ProcessPayment(amount, currency);
}
}
二、装饰器模式:动态扩展支付功能
场景需求
为支付流程添加日志记录、风控验证等附加功能。
模式实现
1 | public abstract class PaymentDecorator : IPaymentStrategy |
三、工厂模式:统一支付对象创建
场景需求
根据配置参数动态创建支付策略实例。
模式实现
1 | public class PaymentFactory |
四、责任链模式:支付流程处理
场景需求
处理支付请求时需要依次执行:参数校验 → 风控检查 → 实际支付 → 结果通知。
模式实现
1 | public abstract class PaymentHandler |
五、综合应用示例
定义支付策略接口
1
2
3
4public interface IPaymentStrategy
{
void ProcessPayment(decimal amount, string currency);
}实现具体支付策略类
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 { /*...*/ }创建支付请求类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26public 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
2
3
4
5
6
7
8
9
10
11public 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
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
65public 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
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Stargazer!
评论






