谈谈模板方法模式,模板方法模式的应用场景是什么?

一、模式核心理解

模板方法模式是一种​​行为设计模式​​,通过定义算法骨架并允许子类重写特定步骤来实现代码复用。

如同建筑图纸规定房屋结构,具体装修由业主决定,该模式适用于​​固定流程中需要灵活扩展​​的场景。

javascript 复制代码
// 基础请求处理类(模板)
class BaseRequestHandler {
  // 模板方法(禁止override)
  async execute() {
    this.validateParams();
    const processed = await this.processRequest();
    this.afterProcess();
    return this.createResponse(processed);
  }

  validateParams() {
    throw new Error("必须实现参数校验方法");
  }

  // 钩子方法(可选实现)
  afterProcess() {}
}

// 具体API请求实现
class UserAPIHandler extends BaseRequestHandler {
  validateParams() {
    if (!this.params.userId) throw "用户ID必填";
  }

  async processRequest() {
    return await fetch(`/users/${this.params.userId}`);
  }

  createResponse(data) {
    return { status: 200, data };
  }
}

// 使用示例
const handler = new UserAPIHandler({ userId: 123 });
handler.execute();

二、典型应用场景

1. 框架生命周期控制

javascript 复制代码
// React类组件示例
class BaseComponent extends React.Component {
  // 模板方法
  componentDidMount() {
    this.initState();
    this.fetchData();
    this.bindEvents();
  }

  initState() {}       // 子类实现
  fetchData() {}       // 子类实现
  bindEvents() {}      // 默认空实现(钩子方法)
}

class UserList extends BaseComponent {
  initState() {
    this.setState({ users: [] });
  }

  fetchData() {
    axios.get('/api/users').then(res => this.setState({ users: res.data }));
  }
}

2. 表单校验系统

javascript 复制代码
class FormValidator {
  validate(formData) {
    this.checkRequiredFields(formData);
    const customResult = this.customValidation(formData);
    return this.formatResult(customResult);
  }

  checkRequiredFields(formData) {
    // 通用必填校验逻辑
  }

  customValidation() {
    throw new Error("必须实现具体校验规则");
  }

  formatResult(result) {
    return { isValid: result, timestamp: Date.now() };
  }
}

class LoginFormValidator extends FormValidator {
  customValidation(formData) {
    return formData.password.length >= 8;
  }
}

三、使用建议

  1. ​流程标准化​:支付流程(风控检查->创建订单->调用支付->结果处理)
javascript 复制代码
class PaymentProcessor {
  async pay(amount) {
    this.riskCheck();
    const order = this.createOrder(amount);
    const result = await this.callPaymentGateway(order);
    return this.handleResult(result);
  }
  // ...抽象方法声明
}
  1. ​合理使用钩子​:在报表生成器中设置可选步骤
javascript 复制代码
class ReportGenerator {
  generate() {
    this.fetchData();
    this.beforeRender(); // 钩子方法
    this.renderHeader();
    this.renderBody();
  }

  beforeRender() {} // 默认空实现
}
  1. ​组合优于继承​:对于复杂场景建议使用策略模式+模板方法
javascript 复制代码
class DataExporter {
  constructor(formatter) {
    this.formatter = formatter;
  }

  export() {
    const raw = this.getData();
    return this.formatter(raw);
  }
}

四、注意事项

  1. ​避免流程碎片化​(错误示例)
javascript 复制代码
// 反模式:过度拆分步骤
class BadTemplate {
  execute() {
    this.step1();
    this.step2();
    this.step3();
    this.step4();
    // 20+步骤...
  }
}
  1. ​子类责任边界​
javascript 复制代码
class OrderProcessor extends BaseProcessor {
  validate() {
    // 不要修改执行顺序
    super.validate(); // 必须调用父类方法
    this.checkInventory(); // 扩展校验
  }
}
  1. ​模板方法冻结​
javascript 复制代码
class SecureBase {
  execute() {
    Object.freeze(this.execute); // 防止子类重写模板方法
    // ...执行流程
  }
}

五、总结

模板方法模式在前端开发中适合处理​​流程固定但实现可变​​的场景,如请求处理、表单校验、生命周期管理等。使用时要注意:

  1. 保持模板方法稳定,通过钩子方法扩展
  2. 子类实现不超过3层继承
  3. 复杂场景结合策略模式使用
  4. 使用TypeScript时声明抽象方法
javascript 复制代码
// TypeScript实现示例
abstract class UIComponent {
  abstract render(): void;

  mount() {
    this.willMount();
    this.render();
    this.didMount();
  }

  protected willMount() {}
  protected didMount() {}
}

正确使用模板方法模式可以提升代码复用率30%以上,但需根据实际场景灵活选择实现方式。

在微前端架构中,该模式常用于基座应用与子应用的生命周期管理,建议结合具体业务需求进行合理设计。

相关推荐
Koma-forever5 天前
java设计模式-代理模式
java·设计模式·模板方法模式
搞不懂语言的程序员7 天前
模板方法模式详解
java·开发语言·模板方法模式
〆、风神8 天前
Spring Boot 可扩展脱敏框架设计全解析 | 注解+策略模式+模板方法模式实战
spring boot·策略模式·模板方法模式
此木|西贝10 天前
【设计模式】模板方法模式
java·设计模式·模板方法模式
coderzpw12 天前
当模板方法模式遇上工厂模式:一道优雅的烹饪架构设计
java·模板方法模式
〆、风神12 天前
装饰器模式与模板方法模式实现MyBatis-Plus QueryWrapper 扩展
mybatis·装饰器模式·模板方法模式
木子庆五16 天前
Android设计模式之模板方法模式
android·设计模式·模板方法模式
Hanson Huang17 天前
23种设计模式-模板方法(Template Method)设计模式
java·设计模式·模板方法模式·行为型设计模式
灏瀚星空21 天前
从指令集鸿沟到硬件抽象:AI 如何重塑手机与电脑编程语言差异——PanLang 原型全栈设计方案与实验性探索1
开发语言·人工智能·机器学习·语言模型·智能手机·架构·模板方法模式