Files
ruoyi-vue-pro/.claude/skills/patterns/template-method-pattern.yaml

119 lines
3.5 KiB
YAML

# 模板方法模式知识库
pattern:
id: "template-method-pattern"
name: "模板方法模式"
category: "行为型模式"
description: "定义一个操作中的算法骨架,将一些步骤延迟到子类中,使得子类可以不改变算法结构即可重定义算法的某些步骤"
# 模式结构
structure:
participants:
- name: "AbstractClass"
role: "抽象类"
description: "定义抽象方法和模板方法,模板方法调用抽象方法"
- name: "ConcreteClass"
role: "具体类"
description: "实现抽象方法,完成具体逻辑"
# 项目中的应用
applications:
- module: "pay"
location: "AbstractPayClient"
purpose: "统一支付流程骨架"
code_path: "yudao-module-pay/.../pay/core/client/impl/AbstractPayClient.java"
implementation: |
public abstract class AbstractPayClient<Config extends PayClientConfig> implements PayClient<Config> {
// 模板方法:统一下单
@Override
public final PayOrderRespDTO unifiedOrder(PayOrderUnifiedReqDTO reqDTO) {
ValidationUtils.validate(reqDTO);
try {
return doUnifiedOrder(reqDTO); // 调用子类实现
} catch (Throwable ex) {
log.error("[unifiedOrder]异常", ex);
throw buildPayException(ex);
}
}
// 抽象方法:由子类实现具体下单逻辑
protected abstract PayOrderRespDTO doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) throws Throwable;
// 抽象方法:初始化
protected abstract void doInit();
}
- module: "infra/sms"
location: "AbstractSmsClient"
purpose: "统一短信发送流程"
code_path: "yudao-module-infra/.../sms/core/client/AbstractSmsClient.java"
implementation: |
public abstract class AbstractSmsClient implements SmsClient {
// 模板方法定义发送流程
}
# 模板方法流程
template_methods:
- name: "unifiedOrder"
module: "pay"
steps:
- "参数校验"
- "调用子类实现下单"
- "异常处理和转换"
hook_methods:
- "doUnifiedOrder()"
- "doInit()"
# 使用场景
scenarios:
- "多个子类有公共行为,但具体实现不同"
- "需要控制算法的整体流程"
- "需要在不同点调用不同的实现"
# 优点
advantages:
- "复用公共代码"
- "控制算法流程"
- "符合开闭原则"
- "便于维护和扩展"
# 缺点
disadvantages:
- "每个实现都需要定义子类"
- "增加了类的数量"
# 扩展指南
extension_guide:
title: "如何新增具体实现"
steps:
- step: 1
action: "创建具体类"
description: "继承抽象类"
- step: 2
action: "实现抽象方法"
description: "doUnifiedOrder(), doInit()等"
- step: 3
action: "注册到工厂"
description: "在工厂中添加创建逻辑"
example:
title: "新增支付渠道"
code: |
public class XxxPayClient extends AbstractPayClient<XxxPayClientConfig> {
@Override
protected void doInit() {
// 初始化SDK
}
@Override
protected PayOrderRespDTO doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) throws Throwable {
// 调用第三方支付API
}
@Override
protected PayRefundRespDTO doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO) throws Throwable {
// 调用第三方退款API
}
}