Vue3+TypeScript实现命令模式

47 阅读5分钟

Vue3+TypeScript实现命令模式:电脑维修操作的灵活封装

命令模式(Command Pattern)听起来是不是有点像“程序员在电脑维修店里给技师下了张维修工单”?它是一种行为型设计模式,将请求封装成对象,让发出请求的人和干活的人解耦,方便排队、记录或撤销操作。今天我们用Vue3和TypeScript,结合一个“电脑维修操作”的幽默例子,带你搞懂命令模式如何优雅地封装请求,代码简洁又好玩,保证通俗易懂,笑中带学!


一、命令模式是什么?

想象你经营一家电脑维修店,客户要修电脑,可能需要“重启”、“换硬盘”或“杀毒”。你不想直接喊技师干活,而是把每个任务写成工单,交给调度员去执行。命令模式就像你的“工单系统”:把每个维修请求封装成命令对象,调度员(调用者)只管发工单,技师(接收者)按工单干活,还能记录工单支持撤销,灵活又解耦!

核心角色

  • 命令接口(Command Interface):定义执行命令的标准方法。
  • 具体命令类(Concrete Command):实现命令,关联接收者并调用其方法。
  • 接收者(Receiver):真正执行维修操作的对象。
  • 调用者(Invoker):负责触发命令执行。

我们用Vue3+TypeScript实现一个前端版的“电脑维修工单系统”,让你边发工单边学命令模式!


二、代码实现

1. 命令接口与接收者

// src/commands/RepairCommand.ts
export interface RepairCommand {
  execute(): string;
}

// src/commands/ComputerRepair.ts
export class ComputerRepair {
  restart(): string {
    return '🔄 重启电脑:系统刷新,问题可能解决!';
  }

  replaceHardDrive(): string {
    return '💾 更换硬盘:新硬盘安装,数据迁移完成!';
  }
}

幽默讲解RepairCommand是“维修工单的模板”,规定每张工单必须能执行。ComputerRepair是“维修技师”,会重启电脑或换硬盘,干活全靠它!

2. 具体命令类

// src/commands/RestartCommand.ts
import { RepairCommand } from './RepairCommand';
import { ComputerRepair } from './ComputerRepair';

export class RestartCommand implements RepairCommand {
  private receiver: ComputerRepair;

  constructor(receiver: ComputerRepair) {
    this.receiver = receiver;
  }

  execute(): string {
    return this.receiver.restart();
  }
}

// src/commands/ReplaceHardDriveCommand.ts
import { RepairCommand } from './RepairCommand';
import { ComputerRepair } from './ComputerRepair';

export class ReplaceHardDriveCommand implements RepairCommand {
  private receiver: ComputerRepair;

  constructor(receiver: ComputerRepair) {
    this.receiver = receiver;
  }

  execute(): string {
    return this.receiver.replaceHardDrive();
  }
}

幽默讲解RestartCommandReplaceHardDriveCommand是两张“工单”,一张让技师重启电脑,另一张让技师换硬盘。工单只管告诉技师干啥,具体怎么干交给技师!

3. 调用者

// src/commands/RepairScheduler.ts
import { RepairCommand } from './RepairCommand';

export class RepairScheduler {
  private command: RepairCommand | null = null;

  setCommand(command: RepairCommand): void {
    this.command = command;
  }

  executeCommand(): string {
    if (this.command) {
      return this.command.execute();
    }
    return '😅 未分配维修工单!';
  }
}

幽默讲解RepairScheduler是“维修调度员”,客户给它一张工单,它就喊技师去干活。换工单?随时设置新的,调度员啥也不管,只管发号施令!

4. Vue3组件:维修工单界面

// src/components/RepairScheduler.vue
<script setup lang="ts">
import { ref } from 'vue';
import { ComputerRepair } from '../commands/ComputerRepair';
import { RestartCommand, ReplaceHardDriveCommand } from '../commands/RepairCommand';
import { RepairScheduler } from '../commands/RepairScheduler';

const repairType = ref('restart');
const result = ref('');
const receiver = new ComputerRepair();
const scheduler = new RepairScheduler();

const executeRepair = () => {
  const command = repairType.value === 'restart' ? new RestartCommand(receiver) : new ReplaceHardDriveCommand(receiver);
  scheduler.setCommand(command);
  result.value = scheduler.executeCommand();
};
</script>

<template>
  <div>
    <h2>电脑维修工单站</h2>
    <div>
      <label>维修类型:</label>
      <select v-model="repairType">
        <option value="restart">重启电脑</option>
        <option value="replaceHardDrive">更换硬盘</option>
      </select>
    </div>
    <button @click="executeRepair">执行维修</button>
    <p>{{ result }}</p>
  </div>
</template>

幽默讲解:这个Vue组件就像店里的“工单派发窗口”,客户选维修类型(重启或换硬盘),点“执行”,命令模式把请求封装成工单,交给调度员喊技师干活。客户(代码)只管选,干活的细节全交给工单系统!


三、应用场景

命令模式在Vue3开发中就像“电脑维修店的工单系统”,非常适合以下场景:

  • 事件处理:将用户操作(如点击、提交)封装成命令,支持撤销或重做。
  • 任务队列:将异步请求(如API调用)封装成命令,排队执行或批量处理。
  • 操作日志:记录用户操作命令,方便回溯或审计。
  • 动态行为:为Vue组件绑定不同命令,运行时切换功能。

幽默例子:你的Vue3项目是个维修店,用户点“修电脑”,命令模式像工单,告诉技师重启还是换硬盘,还能记下来回头查!客户(代码)只管下单,技师忙活,日志自动存!


四、适用性

命令模式适合以下前端场景:

  • 解耦请求:调用者无需知道接收者的具体实现。
  • 支持撤销/重做:需要记录操作历史或支持回滚。
  • 任务调度:需要排队或延迟执行请求。

注意事项

  • 如果请求简单,直接调用可能比命令模式更高效。
  • 过多命令对象可能增加内存开销,需优化存储。

五、注意事项

  1. 命令设计

    • 命令接口保持简单,专注单一职责。
    • 具体命令与接收者松耦合,方便替换。
  2. TypeScript优势

    • 用接口(interface)定义命令行为,确保类型安全。
    • 利用类型检查,防止错误绑定命令。
  3. 性能考虑

    • 命令对象增加内存占用,注意清理无用命令。
    • 批量操作时,优化命令创建和执行流程。
  4. Vue3生态

    • 参考VueUse的工具函数(如useEventBus),学习命令式事件处理。
    • 结合Vue的组合式API,优化命令的响应式管理。

幽默提示:别让命令模式变成“维修店的工单堆”,工单太多技师忙不过来(内存爆炸)!用对场景,命令模式让你的请求像工单一样井井有条!


六、总结

命令模式就像前端开发中的“维修工单系统”,通过封装请求解耦调用者和接收者,支持排队、记录和撤销操作。在Vue3+TypeScript项目中,它适合事件处理、任务队列或操作日志场景。命令模式让你的代码像智能工单,请求清晰,执行灵活,优雅又高效!