乐于分享
好东西不私藏

聚合支付系统的"流水线工厂":一个模板方法模式的神级操作!

聚合支付系统的"流水线工厂":一个模板方法模式的神级操作!

1 从奶茶店说起

想象一下,你开了一家连锁奶茶店🧋

  • 北京店要做珍珠奶茶
  • 上海店要做水果茶
  • 深圳店要做柠檬茶

问题来了: 每开一家新店,都要重新培训员工从头学起吗?

聪明的老板会这样做:

  1. 制定一个标准配方模板📝
  2. 每种奶茶都遵循: 准备原料 → 调制 → 加冰 → 封杯→ 出餐
  3. 不同奶茶只是原料不同,流程完全一样!

这就是模板方法模式的精髓! 🎯

而我们今天要看的支付系统,就用了一招"奶茶店秘籍"!

2 什么是模板方法模式?

2.1 通俗解释

模板方法模式就像做菜菜谱👨‍🍳

菜谱(父类)规定了固定步骤:

  1. 准备食材
  2. 热锅倒油
  3. 下锅翻炒
  4. 调味出锅

不同厨师(子类)可以:

  • 用不同的食材(西红柿vs土豆)
  • 但不能改变做菜顺序!

核心思想: 流程固定,细节可变

3 支付系统的"奶茶店"架构

3.1 业务背景

我们有一个聚合支付系统,需要对接6个支付渠道:

  • 盛付通
  • 海科融通
  • 拉卡拉
  • 易生支付
  • 乐刷
  • 嘉联支付

每个渠道都要实现相同的业务功能:

  •  商户进件(入驻)
  •  商户信息修改
  •  审核状态查询
  •  微信/支付宝认证
  •  APPID绑定

问题来了: 6个渠道 × 5个功能 = 30套代码? 😱

NO! 我们用模板方法模式,一套代码搞定! 🎉

4 核心架构:三层"奶茶店"模式

4.1 📊 架构图

┌─────────────────────────────────────────────┐│           🏪 业务应用层(前台点餐)              ││    商户提交申请、运营人员查询状态              │└──────────────────┬──────────────────────────┘                   │ 点单                   ▼┌─────────────────────────────────────────────┐│           🎭 渠道策略层(服务员)                ││   盛付通服务员 │ 海科融通服务员 │ 拉卡拉服务员       ││   职责: 接待客户、识别渠道需求                 │└──────────────────┬──────────────────────────┘                   │ 转交后厨                   ▼┌─────────────────────────────────────────────┐│           👨‍🍳 模板方法层(标准菜谱)            ││         AbstractHandleProvider               ││   7个标准流程:进件、修改、查询、认证...        ││   678行代码,定义所有业务骨架                  │└──────────────────┬──────────────────────────┘                   │ 准备食材                   ▼┌─────────────────────────────────────────────┐│           🔄 数据适配层(食材转换)              ││   convertRequest() - 50+字段转换             ││   内部数据 ↔ 支付渠道SDK格式                 │└──────────────────┬──────────────────────────┘                   │ 呼叫供应商                   ▼┌─────────────────────────────────────────────┐│           🏭 外部服务层(食材供应商)            ││   DTPayService - 聚合支付中台               ││   盛付通SDK │ 海科融通SDK │ 拉卡拉SDK               │└─────────────────────────────────────────────┘

4.2 各层职责(用奶茶店比喻)

层级

奶茶店角色

技术职责

代码量

业务应用层

前台点餐员

接收HTTP请求、返回响应

约500行

渠道策略层

服务员

识别客户要哪个渠道

约800行(6个类)

模板方法层

标准菜谱

定义业务流程骨架

678行

数据适配层

食材准备员

数据格式转换

约350行

外部服务层

食材供应商

调用支付渠道API

外部依赖

5 📖 七大"标准菜谱"(模板方法)

📋 菜谱清单

我们的"后厨大师傅"(AbstractHandleProvider)掌握了7道标准菜谱

序号
菜谱名称
方法名
业务场景
步骤数
1
商户进件

createStore()

新商户入驻
8步
2
商户信息修改

updateStore()

修改商户资料
8步
3
审核状态查询

getStoreProcess()

查询进件进度
11步
4
认证状态查询

getAuthProcess()

微信/支付宝认证
8步
5
APPID绑定

bindAppIdProcess()

绑定小程序
6步
6
微信认证

wechatAuth()

微信实名认证
8步
7
支付宝认证

alipayAuth()

支付宝实名认证
8步

6 时序图:商户进件的"八步烹饪法"

🎯 八步烹饪法详解

步骤
奶茶店比喻
技术实现
是否可变

1️⃣ 记录日志

接单记账

log.info("进件开始")

 固定

2️⃣ 准备食材

按配方准备原料

convertRequest()

转换50+字段

可定制

3️⃣下锅烹饪

调用SDK创建商户

dtPayService.create()

 固定

4️⃣ 记录结果

记录烹饪完成

log.info("进件结束")

 固定

5️⃣ 装盘出餐

组装响应对象

创建PayStoreResponseVo

 固定

6️⃣ 质量检查

检查商户状态

判断NORMAL/ABNORMAL

 固定

7️⃣ 通知取餐

发送MQ消息

mqSendService.send()

 固定

8️⃣ 后续处理

业务系统更新

异步更新数据库、通知用户

 固定

关键发现: 8步中只有第2步(准备食材)可以定制,其他7步完全固定!

这就是模板方法的威力:流程不变,食材可变! 🎉

7 🔄 时序图:商户审核状态查询

🎯 查询逻辑亮点

一个接口,三个渠道状态:

  • 微信认证:  已通过(商户号wx001)
  • 支付宝认证:  审核中(预计1-2个工作日)
  • 银联认证:  已驳回(原因:资料不完整,请重新提交)

设计巧妙之处:

  • 使用Stream API过滤三个渠道状态
  • 每个渠道独立转换,互不影响
  • 使用Optional避免空指针异常

8 💡 为什么要用模板方法模式?

8.1 痛点场景:没有模板方法的痛苦

假设我们不用模板方法模式,每个渠道都自己写:

盛付通渠道:  - 进件: 200行代码  - 修改: 180行代码  - 查询: 250行代码  - 认证: 200行代码  - 绑定: 150行代码  小计: 980行海科融通渠道: (重复写一遍)  小计: 980行易生渠道: (再重复一遍)  小计: 980行... (6个渠道)总计: 980 × 6 = 5880行代码! 😱

而且:

  •  修改一个bug要改6个地方
  •  新增一个功能要写6遍
  •  代码重复率高达90%

8.2 爽点场景:用了模板方法的快乐

AbstractHandleProvider(模板方法层):  - 进件模板: 120行  - 修改模板: 100行  - 查询模板: 150行  - 认证模板: 130行  - 绑定模板: 80行  - 数据转换: 350行  - 辅助方法: 200行  小计: 1130行6个渠道策略类:  - 每个只需实现support()方法: 5行  - 小计: 5 × 6 = 30行总计: 1130 + 30 = 1160行代码! 🎉

代码量减少80%! 📉

而且:

  •  修改一个bug只改一处,6个渠道同时生效
  •  新增一个功能只写一次,所有渠道自动拥有
  • ✅ 代码重复率降到10%以下

9 🚀 扩展性:新增渠道只需3步

9.1 传统方式(痛苦模式)

新增一个渠道:

  1. 复制一个渠道的代码
  2. 修改所有硬编码的渠道标识
  3. 修改工厂配置
  4. 修改路由逻辑
  5. 测试所有功能
  6. 耗时: 3天😫

9.2 模板方法方式(快乐模式)

新增一个渠道:

第1步: 创建新策略类

@Componentpublic class NewChannelProvider extends AbstractHandleProvider {    @Override    public boolean support(String channelCode) {        return "NEW".equalsIgnoreCase(channelCode);    }}

第2步: 添加渠道编码常量

String NEW = "NEW";

第3步: 重启应用

耗时: 0.5天 🎉

工厂自动发现新策略,无需任何配置!

10 📊 业务架构全景图

┌──────────────────────────────────────────────────┐                  🏪 业务应用层                       BossController / UserController / 定时任务          功能: 商户进件商户更新状态查询认证绑定        └────────────────────┬─────────────────────────────┘                      HTTP请求                     ┌──────────────────────────────────────────────────┐                  🎭 渠道策略层                         SFTHandleProvider  HKRTHandleProvider              LKLHandleProvider LSHandleProvider              YSHandleProvider JLHandleProvider            职责: 渠道路由判断特殊逻辑重写                 └────────────────────┬─────────────────────────────┘                      调用模板方法                     ┌──────────────────────────────────────────────────┐                👨‍🍳 模板方法层(核心)                          AbstractHandleProvider                     7个模板方法: 进件/修改/查询/认证/绑定                12个适配器方法: 数据转换(50+字段)                   678行核心代码,定义所有业务流程                   └────────────────────┬─────────────────────────────┘                      SDK调用                     ┌──────────────────────────────────────────────────┐                  🏭 外部服务层                         DTPayService - 聚合支付中台SDK                    MqSendService - 消息队列服务                     └──────────────────────────────────────────────────┘

11 🎯 总结:模板方法模式的五大优势

1️⃣ 代码复用率高达90%

  • 6个渠道共享同一个convertRequest方法
  • 50+字段转换逻辑只写一次
  • 异常处理、日志记录、MQ发送全部复用

2️⃣ 扩展性极强

  • 新增渠道只需3步,0.5天搞定
  • 无需修改现有代码
  • 符合开闭原则

3️⃣ 流程标准化

  • 所有渠道遵循相同的处理流程
  • 便于新员工快速理解
  • 避免遗漏关键步骤

4️⃣ 可维护性强

  • 修改转换规则只需改一处
  • Bug修复影响范围可控
  • 代码量减少80%

5️⃣ 业务价值巨大

  • 提升开发效率: 新增渠道从3天→0.5天
  • 降低维护成本: 代码量减少60%
  • 提高系统稳定性: 统一的异常处理机制

12 🎊 结语

模板方法模式,就像奶茶店的标准配方模板:

  • 📝 流程固定: 所有奶茶都遵循相同的步骤
  • 🎨细节可变: 每种奶茶的原料可以不同
  • 🚀易于扩展: 新增奶茶口味,只需添加新配方

我们的支付系统,就是靠这套"奶茶店秘籍":

  •  6个渠道,统一流程
  •  50+字段转换,代码复用
  •  新增渠道,3步搞定

设计模式不是炫技,而是解决实际问题的利器! 💪


13📚 延伸思考

如果你的业务系统也有以下场景,可以考虑模板方法模式:

  1.  多渠道接入(支付、短信、物流等)
  2. 多类型处理(订单、用户、商品等)
  3.  流程固定但细节可变的场景
  4.  需要高度复用代码的场景

记住一句话:流程固定,细节可变,就用模板方法!🎯


点赞❤️ 收藏 转发🔄 让更多开发者看到!

关注我,获取更多设计模式实战解析! 🚀

聚合支付系统里,究竟藏了多少种设计模式

01 观察者模式驱动:支付播报中心的事件监听与推送架构

02 从聚合支付的复式记账看策略模式:一个接口两种记账方式

03 聚合支付财务统计的"接力赛":责任链模式实战解析