定義
命令模式: 將“請求”封裝成對象,以便使用不同的請求、隊列或者日誌參數化其他對象。命令模式也支持可撤銷的操作。
優點: 命令模式可以將“動作的請求者”從“動作的執行者”對象中解耦。利用命令對象,把請求(執行者&其動作)封裝成一個特定對象。所以,如果每個Invoker都存儲一個命令對象,那麼當按鈕按下的時候,就可以請命令對象做相關的工作。Invoker並不需要知道工作內容是什麼,之要有個命令對象能和正確的對象溝通,把事情做好就可以了。
類圖
擴展
撤銷功能:
- ConcreteCommand提供和execute()方法相反的undo()方法;
- Invoker中添加一個新的實例變量,用來記錄最後被調用的命令;
- 如果ConreteCommand擁有多個狀態,那麼需要其添加一個prevState變量,用來記錄上次的狀態,供undo()使用。
MacroCommand(宏命令)
同時執行多個動作。
public class MacroCommand implements Command {
Command[] commands;
public MacroCommand(Command[] commands) {
this.commands = commands;
}
public void execute() {
for(int i = 0; i < commands.length; i++) {
commands[i].execute();
}
}
public void undo() {
for(int i = 0; i < commands.length; i++) {
commands[i].undo();
}
}
}