1.命令模式介紹
命令模式(Command Pattern)是一種行為設計模式,它將請求或操作封裝為對象,使得可以用不同的請求對客戶端進行參數化。命令模式的核心思想是將方法調用、請求或操作封裝到一個獨立的命令對象中,從而使得客戶端與請求的接收者分離。
結構組成:命令模式通常包含以下幾個組件:
- Command(命令)接口:定義執行操作的接口。
- ConcreteCommand(具體命令)類:實現命令接口并定義具體的操作。
- Receiver(接收者):實際執行命令的對象,具體實現操作。
- Invoker(調用者):持有一個命令對象,調用命令對象執行請求。
類比場景:想象一下,你家里有一個智能燈,你可以按下遙控器上的按鈕來打開或關閉燈。
- 這里遙控器就是Invoker,調用開關燈命令對象執行開關燈請求;
- 遙控器的每個按鈕相當于一個命令對象command,它負責執行具體的開關燈操作;
- 智能燈就是Receiver,是實際執行開關命令的對象
優缺點分析
- 優點:
- 解耦:將請求的發送者和接收者解耦,使得命令對象可以靈活地擴展和組合。
- 可擴展性:可以很容易地添加新的命令,符合開放-關閉原則。
- 支持撤銷操作:可以通過在命令對象中實現撤銷功能來支持操作的撤銷和重做。
- 缺點:
- 可能導致類膨脹:對于每個命令都需要定義一個具體命令類,可能會導致類數量增加。
- 復雜性增加:引入了額外的抽象層,可能導致系統復雜性增加
2. 代碼演示
演示場景:使用遙控器控制智能燈的開關。
Command(命令)接口:?定義執行操作的接口。
// Command接口
public interface Command {void execute();
}
ConcreteCommand(具體命令)類:實現命令接口并定義具體的操作。
// ConcreteCommand類:持有接收者對象Light,調用接收者來執行命令
public class LightOnCommand implements Command {private Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOn();}
}public class LightOffCommand implements Command {private Light light;public LightOffCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOff();}
}
Receiver(接收者):實際執行命令的對象,具體實現操作。
// Receiver類
public class Light {public void turnOn() {System.out.println("The light is on");}public void turnOff() {System.out.println("The light is off");}
}
Invoker(調用者):持有命令對象,負責調用命令對象執行請求。
// Invoker類
public class RemoteControl {private Command command;public void setCommand(Command command) {this.command = command;}public void pressButton() {command.execute();}
}
客戶端代碼:
public class CommandClientDemo {public static void main(String[] args) {Light livingRoomLight = new Light();Command lightOn = new LightOnCommand(livingRoomLight);Command lightOff = new LightOffCommand(livingRoomLight);RemoteControl remote = new RemoteControl();remote.setCommand(lightOn);remote.pressButton(); // 輸出: The light is onremote.setCommand(lightOff);remote.pressButton(); // 輸出: The light is off}
}
對應的類圖: