一、模式介紹
指令模式的作用在于将請求的調用者與請求的處理者松耦合,進而使得調用者不必再關心請求的執行細節(如被誰執行的,怎麼執行的等等),調用者和處理者可以自由變化。
實作方案:聲明一個指令調用接口,用戶端使用該接口中聲明的指令統一執行方式執行指令,在具體指令的實作中查找并使用真實處理者中的具體方法。
另外,通過指令執行者的介入,可以友善地實作,曆史指令記錄、取消指令執行(undo)、重新執行指令(redo)、批量執行等等。
二、原理圖

三、示例代碼
import java.util.ArrayList;
import java.util.List;
interface ComputerCommand {
void execute();
// undo execute
}
// Receiver
class Computer {
void startup() {
System.out.println("開機 ...");
}
void shutdown() {
System.out.println("關機 ...");
}
void restart() {
System.out.println("重新開機 ...");
}
}
class StartupCommand implements ComputerCommand {
Computer computer;
public StartupCommand(Computer computer) {
this.computer = computer;
}
@Override
public void execute() {
computer.startup();
}
}
class ShutdownCommand implements ComputerCommand {
Computer computer;
public ShutdownCommand(Computer computer) {
this.computer = computer;
}
@Override
public void execute() {
computer.shutdown();
}
}
class RestartCommand implements ComputerCommand {
Computer computer;
public RestartCommand(Computer computer) {
this.computer = computer;
}
@Override
public void execute() {
computer.restart();
}
}
// Invoker:可實作 undo redo 等等
class CommandInvoker {
List historyCommands = new ArrayList();
void storeAndExecute(ComputerCommand command) {
historyCommands.add(command);// 記錄,可實作 undo redo 等等
command.execute();
}
}
public class Test {
public static void main(String[] args) {
Computer computer = new Computer();
CommandInvoker invoker = new CommandInvoker();
invoker.storeAndExecute(new StartupCommand(computer));
invoker.storeAndExecute(new RestartCommand(computer));
invoker.storeAndExecute(new ShutdownCommand(computer));
}
}
輸出結果:
開機 ...
重新開機 ...
關機 ...