6Head First Design Patterns(第2版)

命令模式

封装请求

命令模式请求队列撤销操作宏命令

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第6章:命令模式(Command Pattern)

一、导读

1.1 本章学习目标

第6章讲解命令模式——将请求封装为对象,从而支持参数化、排队、撤销等操作。

1.2 为什么第六章如此重要

命令模式将请求的发送者和接收者解耦,支持撤销、重做、日志记录等功能。

1.3 核心问题引导

命令模式如何封装请求?

如何实现撤销操作?

宏命令是什么?

命令模式在哪些场景中应用?


二、核心概念详解

6.1 命令模式结构

java
// 命令接口
public interface Command {
    void execute();
    void undo();
}

// 具体命令
public class LightOnCommand implements Command {
    private Light light;
    
    public LightOnCommand(Light light) { this.light = light; }
    
    public void execute() { light.on(); }
    public void undo() { light.off(); }
}

// 调用者
public class RemoteControl {
    private Command command;
    
    public void setCommand(Command command) { this.command = command; }
    
    public void pressButton() { command.execute(); }
    public void pressUndo() { command.undo(); }
}

// 使用
Light light = new Light();
Command lightOn = new LightOnCommand(light);
RemoteControl remote = new RemoteControl();
remote.setCommand(lightOn);
remote.pressButton();  // 灯亮
remote.pressUndo();    // 灯灭

6.2 宏命令

java
public class MacroCommand implements Command {
    private List<Command> commands;
    
    public MacroCommand(List<Command> commands) {
        this.commands = commands;
    }
    
    public void execute() {
        commands.forEach(Command::execute);
    }
    
    public void undo() {
        // 逆序撤销
        for (int i = commands.size() - 1; i >= 0; i--) {
            commands.get(i).undo();
        }
    }
}

三、实战案例

3.1 文本编辑器撤销

java
public class TextEditor {
    private StringBuilder text = new StringBuilder();
    private Deque<Command> history = new ArrayDeque<>();
    
    public void type(String chars) {
        Command cmd = new TypeCommand(text, chars);
        cmd.execute();
        history.push(cmd);
    }
    
    public void undo() {
        if (!history.isEmpty()) {
            history.pop().undo();
        }
    }
}

四、本章小结

命令模式将请求封装为对象,支持撤销、重做、排队。宏命令可以批量执行命令。


五、思考与练习

命令模式和策略模式有什么区别?

如何实现多级撤销?

命令模式如何用于事务处理?

Lambda 表达式如何简化命令模式?

命令模式在 GUI 中如何应用?


6/12命令模式
0%