命令模式將「請求」封裝為一個獨立對象,從而使您能以不同的請求參數化客戶端、將請求排入佇列、記錄請求日誌、以及支援可撤銷的操作。其核心在於將「行為的請求者」與「行為的實現者」解耦,實現雙方的鬆耦合。
execute() 方法。每個命令需一個具體類別,可能導致類別數量膨脹,增加系統複雜度。
模擬電視的開機、關機、換台操作。
public interface Command {
void execute();
}
public class Tv {
private int currentChannel = 0;
public void turnOn() { System.out.println("電視開啟"); }
public void turnOff() { System.out.println("電視關閉"); }
public void changeChannel(int channel) {
this.currentChannel = channel;
System.out.println("當前頻道:" + channel);
}
}
public class CommandOn implements Command {
private Tv tv;
public CommandOn(Tv tv) { this.tv = tv; }
public void execute() { tv.turnOn(); }
}
public class CommandOff implements Command {
private Tv tv;
public CommandOff(Tv tv) { this.tv = tv; }
public void execute() { tv.turnOff(); }
}
public class CommandChange implements Command {
private Tv tv;
private int channel;
public CommandChange(Tv tv, int channel) { this.tv = tv; this.channel = channel; }
public void execute() { tv.changeChannel(channel); }
}
public class RemoteControl {
private Command onCmd, offCmd, changeCmd;
public RemoteControl(Command on, Command off, Command change) {
this.onCmd = on; this.offCmd = off; this.changeCmd = change;
}
public void turnOn() { onCmd.execute(); }
public void turnOff() { offCmd.execute(); }
public void changeChannel() { changeCmd.execute(); }
}
public class Client {
public static void main(String[] args) {
Tv tv = new Tv(); // 接收者
Command on = new CommandOn(tv); // 具體命令
Command off = new CommandOff(tv);
Command chg = new CommandChange(tv, 5);
RemoteControl rc = new RemoteControl(on, off, chg); // 調用者
rc.turnOn(); // 輸出:電視開啟
rc.changeChannel(); // 輸出:當前頻道:5
rc.turnOff(); // 輸出:電視關閉
}
}