Vue3+TypeScript实现模板方法模式

69 阅读5分钟

Vue3+TypeScript实现模板方法模式:电脑组装的标准化流程

模板方法模式(Template Method Pattern)听起来是不是有点像“程序员在电脑组装店里制定了一套标准流水线”?它是一种行为型设计模式,在抽象类中定义了一个固定的流程框架,把具体步骤交给子类去实现。今天我们用Vue3和TypeScript,结合一个“电脑组装流程”的幽默例子,带你搞懂模板方法模式如何让流程统一又灵活,代码优雅又好玩,保证通俗易懂,笑中带学!


一、模板方法模式是什么?

想象你经营一家电脑组装店,不管是组装游戏电脑还是办公电脑,流程都差不多:选零件、组装、测试。但每种电脑的具体零件和组装方式可能不同。模板方法模式就像你的“组装流水线”:在抽象类中定义一个固定的组装流程(模板方法),具体步骤(比如选啥零件)交给子类去实现,这样既保证流程统一,又能灵活定制。

核心角色

  • 抽象模板类:定义组装流程的框架,包含模板方法和抽象步骤。
  • 具体模板类:实现抽象步骤,定制具体组装逻辑。
  • 客户端:调用模板方法,触发整个流程。

我们用Vue3+TypeScript实现一个前端版的“电脑组装流水线”,让你边组装电脑边学模板方法模式!


二、代码实现

1. 抽象模板类

// src/templates/ComputerAssembly.ts
export abstract class ComputerAssembly {
  // 模板方法,定义组装流程
  public assembleComputer(): string {
    const steps = [
      this.selectParts(),
      this.assembleParts(),
      this.testSystem(),
    ];
    return `💻 电脑组装完成!\n${steps.join('\n')}`;
  }

  // 具体方法,由抽象类实现
  protected selectParts(): string {
    return '🛠️ 挑选基础零件:主板、电源、机箱';
  }

  // 抽象方法,子类实现
  protected abstract assembleParts(): string;

  // 具体方法,由抽象类实现
  protected testSystem(): string {
    return '✅ 测试系统:开机正常,性能稳定';
  }
}

幽默讲解ComputerAssembly是店里的“组装流水线”,assembleComputer是总控开关,规定了选零件、组装、测试的顺序。选零件和测试是通用的,直接写好;组装方式因电脑不同,交给子类去发挥!

2. 具体模板类:游戏电脑

// src/templates/GamingComputerAssembly.ts
import { ComputerAssembly } from './ComputerAssembly';

export class GamingComputerAssembly extends ComputerAssembly {
  protected assembleParts(): string {
    return '🔧 组装游戏电脑:安装高性能GPU、RGB灯条、超频CPU';
  }
}

幽默讲解GamingComputerAssembly是“电竞神机流水线”,继承了总流程,但组装时专门挑高性能GPU和RGB灯条,装出来的电脑能跑4K游戏,闪瞎眼!

3. 具体模板类:办公电脑

// src/templates/OfficeComputerAssembly.ts
import { ComputerAssembly } from './ComputerAssembly';

export class OfficeComputerAssembly extends ComputerAssembly {
  protected assembleParts(): string {
    return '🔧 组装办公电脑:安装低功耗CPU、集成显卡、大容量硬盘';
  }
}

幽默讲解OfficeComputerAssembly是“办公利器流水线”,组装时选低功耗零件,省电又稳定,适合Word和Excel跑一天不卡!

4. Vue3组件:组装服务界面

// src/components/ComputerAssembler.vue
<script setup lang="ts">
import { ref } from 'vue';
import { GamingComputerAssembly, OfficeComputerAssembly } from '../templates/ComputerAssembly';

const computerType = ref('gaming');
const assemblyResult = ref('');

const assemble = () => {
  const assembly = computerType.value === 'gaming' ? new GamingComputerAssembly() : new OfficeComputerAssembly();
  assemblyResult.value = assembly.assembleComputer();
};
</script>

<template>
  <div>
    <h2>电脑组装流水线</h2>
    <div>
      <label>电脑类型:</label>
      <select v-model="computerType">
        <option value="gaming">游戏电脑</option>
        <option value="office">办公电脑</option>
      </select>
    </div>
    <button @click="assemble">开始组装</button>
    <pre>{{ assemblyResult }}</pre>
  </div>
</template>

幽默讲解:这个Vue组件就像店里的“组装控制面板”,客户选好电脑类型(游戏或办公),点一下“开始组装”,模板方法模式按固定流程走完选零件、组装、测试,吐出一台完美电脑!换个类型?改个选项,流水线自动调整!


三、应用场景

模板方法模式在Vue3开发中就像“电脑组装的标准化流水线”,非常适合以下场景:

  • 组件渲染流程:为Vue组件定义统一渲染流程(如加载、渲染、动画),具体渲染逻辑由子组件实现。
  • 表单处理:规定表单提交流程(验证、格式化、请求),具体验证规则由子类定制。
  • API请求框架:定义请求流程(认证、发送、处理响应),具体请求参数由子类提供。
  • 动画序列:为UI动画设置固定步骤(如开始、过渡、结束),具体动画效果由子类实现。

幽默例子:你的Vue3项目是个电脑组装店,用户要游戏电脑?模板方法模式走一遍流程,装上GPU和灯条!要办公电脑?同一流程,换成省电零件!客户(代码)只管选,流水线全搞定!


四、适用性

模板方法模式适合以下前端场景:

  • 统一算法框架:多个组件或逻辑有相同流程,但部分步骤不同。
  • 控制执行顺序:需要强制子类遵循特定步骤顺序。
  • 代码复用:将不变的流程逻辑放在抽象类,减少重复代码。

注意事项

  • 如果流程差异太大,强制统一可能导致设计不自然。
  • 抽象类逻辑过多可能变成“上帝类”,注意职责分离。

五、注意事项

  1. 模板方法设计

    • 模板方法用final(或TypeScript中类似机制)防止子类篡改流程。
    • 抽象方法聚焦具体差异,避免子类实现无关逻辑。
  2. TypeScript优势

    • 用抽象类(abstract class)定义模板,确保类型安全。
    • 利用类型检查,防止子类遗漏实现抽象方法。
  3. 性能考虑

    • 模板方法增加一层抽象调用,注意不要为简单逻辑加复杂框架。
    • 确保具体实现高效,避免流程瓶颈。
  4. Vue3生态

    • 参考Vue的生命周期钩子,学习如何定义统一流程。
    • 结合Vue的组合式API,优化模板方法的响应式管理。

幽默提示:别让模板方法模式变成“电脑组装店的死板流水线”,流程太僵硬子类不高兴(代码难写)!选对场景,模板方法让你的代码像流水线一样稳又灵!


六、总结

模板方法模式就像前端开发中的“电脑组装流水线”,通过定义固定流程框架,让子类灵活实现具体步骤。在Vue3+TypeScript项目中,它适合统一组件渲染、表单处理或API请求流程。模板方法模式让你的代码像标准化生产线,流程清晰,定制自由!