一、核心思想与模式定位
1.1 策略模式
将算法封装为独立对象,使它们可以相互替换。这样通过组合而非继承实现行为变化开遵循开闭原则。
1.2 模板方法模式
定义算法骨架,将可变步骤延迟到子类实现。这样通过继承控制算法结构,体现"好莱坞原则"。
1.3 结构对比
| 维度 | 策略模式 | 模版方法 |
| 意图 | 算法互换 | 算法骨架定义 |
| 关系 | 对象组合 | 类继承 |
| 变化点 | 完整算法 | 算法步骤 |
| 控制权 | 客户端 | 父类 |
二、设计模式在支付中心中的应用
2.1 模版方法
1. 结构体现
• AbsTradeHandler 作为抽象基类,定义了支付、退款、订单状态同步等核心业务流程的主线(即算法骨架),如 Charge、Refund、SyncBillState 等方法。
• 这些方法内部会调用一系列虚方法或抽象方法(如 VerifyChargeParams、BuildChargeCert、RequestRefund、BuildRefundResult 等),这些步骤的具体实现由子类负责。
2. 典型流程(以 Charge 为例)
public ChargeCredential Charge(ChargeParams chargeParams)
{
// 1. 参数校验(可被子类重写)
this.VerifyChargeParams(chargeParams);
// 2. 构建收款订单(基类实现)
ChargeBillEntity chargeBill = this.BuildChargeBill(chargeParams);
// 3. 构建收款凭据(可被子类重写/实现)
ChargeCredential chCre = this.BuildChargeCert(chargeBill, chargeParams);
// 4. 更新订单(基类实现)
this.UpdateChargeBill(chargeBill);
// 5. 发送异步查询任务(可被子类重写)
this.SendChargeQueryTask(chargeBill, chargeParams);
return chCre;
}
其中主流程不可变,但每个关键步骤都可由子类定制,体现了模版方法模式的精髓。
2.2 策略模式
1. 结构体现
• AbsTradeHandler 只是支付处理的抽象,每种支付渠道(如微信、支付宝、翼支付等)都实现了自己的 Handler(如 AsaasCardPayHandler、BestpayPayHandler 等),这些子类实现了基类的抽象方法,封装了各自的业务策略。
• 业务代码通过 ITradeHandler 接口操作,具体用哪种 Handler 由工厂(如 TradeHandlerFactory)根据
动态决定。
2. 典型用法
ITradeHandler handler = TradeHandlerFactory.GetTradeHandler(appId, payChannel);
handler.Charge(chargeParams);
handler.Refund(refundParams);handler 的实际类型在运行时由工厂决定,不同渠道的 Handler 封装了不同的支付策略,但对外暴露统一接口,业务层无需关心具体实现。
三、总结
AbsTradeHandler 及其子类体系是模版方法模式和策略模式协同应用的典范。
通过工厂+抽象基类+多实现的组合,既保证了流程统一,又实现了策略灵活切换。在设计中使用策略模式则让每种支付渠道的实现细节灵活可变,便于新增、切换和维护不同支付方式。利用模版方法模式保证了所有支付流程的主线一致,便于维护和扩展。