天天看點

行為型模式之指令模式(Command)

一、模式介紹

指令模式的作用在于将請求的調用者與請求的處理者松耦合,進而使得調用者不必再關心請求的執行細節(如被誰執行的,怎麼執行的等等),調用者和處理者可以自由變化。

實作方案:聲明一個指令調用接口,用戶端使用該接口中聲明的指令統一執行方式執行指令,在具體指令的實作中查找并使用真實處理者中的具體方法。

另外,通過指令執行者的介入,可以友善地實作,曆史指令記錄、取消指令執行(undo)、重新執行指令(redo)、批量執行等等。

二、原理圖

行為型模式之指令模式(Command)

三、示例代碼

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));
    }
}
           

輸出結果:

開機 ...
重新開機 ...
關機 ...
           

繼續閱讀