Skip to content

命令模式

字数: 0 字 时长: 0 分钟

简介

命令模式(Command Pattern)的核心思想是:把请求封装成一个对象,使你可以将其排队、撤销或记录日志等。比如餐厅点餐,客人只需要创建一个点菜订单,而不需要直接与厨师交互,服务员可对订单进行排队、撤销或记录流水。

UML 类图

command.webp

  • 命令接口(Command):声明执行操作的方法,比如 execute()
  • 具体命令(ConcreteCommand):实现命令接口,负责调用接收者去完成请求
  • 接收者(Receiver):负责真正执行具体的业务逻辑
  • 请求者(Invoker):调用命令对象,执行请求
  • 客户端(Client):创建具体命令对象,并设置命令的接收者,最后把命令交给请求者执行

实现示例

以“任务调度系统”为例,使用命令模式构建一个可扩展的任务执行平台

java
// 1. 命令接口
interface Task {
    void execute();
}

// 2. 具体命令
class EmailTask implements Task {
    @Override
    public void execute() {
        System.out.println("发送通知邮件");
    }
}
class BackupTask implements Task {
    @Override
    public void execute() {
        System.out.println("备份数据");
    }
}
class ReportTask implements Task {
    @Override
    public void execute() {
        System.out.println("生成报表");
    }
}

// 3. 任务调度器
class TaskScheduler {
    private Queue<Task> taskQueue = new LinkedList<>();
    public void addTask(Task task) {
        taskQueue.offer(task);
    }
    public void run() {
        while (!taskQueue.isEmpty()) {
            Task task = taskQueue.poll();
            task.execute();
        }
    }
}

// 4. 调用示例
public static void main(String[] args) {
    TaskScheduler scheduler = new TaskScheduler();
    scheduler.addTask(new EmailTask());
    scheduler.addTask(new BackupTask());
    scheduler.addTask(new ReportTask());
    scheduler.run();
}