設(shè)計模式-命令模式
命令模式(Command Pattern) 是一種行為型設(shè)計模式,它將一個請求封裝為一個對象,從而使你可以用不同的請求對客戶進行參數(shù)化,對請求排隊或記錄請求日志,以及支持可撤銷的操作。
命令模式的核心思想是 將請求的發(fā)出者與處理者解耦,請求的發(fā)出者只需知道如何調(diào)用命令,而不需要了解命令的具體執(zhí)行細節(jié)。
命令模式的組成部分
- 命令接口(Command):定義了一個統(tǒng)一的接口,用于執(zhí)行命令。
- 具體命令類(ConcreteCommand):實現(xiàn)命令接口,封裝具體的操作邏輯。
- 接收者(Receiver):實際執(zhí)行命令的類,包含具體的操作實現(xiàn)。
- 調(diào)用者(Invoker):負責調(diào)用命令對象以執(zhí)行請求。
- 客戶端(Client):創(chuàng)建具體命令對象并將其綁定到接收者和調(diào)用者。
命令模式的使用場景
- 需要對行為進行封裝時:將動作抽象成命令類對象。
- 支持撤銷/重做功能:通過保存命令歷史記錄。
- 支持請求的排隊和日志功能。
- 需要將調(diào)用者與實際執(zhí)行者解耦。
示例:智能家居命令控制
假設(shè)我們有一個智能家居系統(tǒng),可以通過命令模式來控制燈的開關(guān)操作。
1. 定義命令接口
// 命令接口
interface Command {
void execute(); // 執(zhí)行命令
void undo(); // 撤銷命令
}
2. 創(chuàng)建接收者(Receiver)
// 接收者:燈
class Light {
public void turnOn() {
System.out.println("燈已打開");
}
public void turnOff() {
System.out.println("燈已關(guān)閉");
}
}
3. 創(chuàng)建具體命令類
// 具體命令:打開燈
class TurnOnLightCommand implements Command {
private Light light;
public TurnOnLightCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOn();
}
@Override
public void undo() {
light.turnOff();
}
}
// 具體命令:關(guān)閉燈
class TurnOffLightCommand implements Command {
private Light light;
public TurnOffLightCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOff();
}
@Override
public void undo() {
light.turnOn();
}
}
4. 創(chuàng)建調(diào)用者(Invoker)
// 調(diào)用者:遙控器
class RemoteControl {
private Command command;
// 設(shè)置命令
public void setCommand(Command command) {
this.command = command;
}
// 執(zhí)行命令
public void pressButton() {
if (command != null) {
command.execute();
}
}
// 撤銷命令
public void pressUndo() {
if (command != null) {
command.undo();
}
}
}
5. 客戶端代碼
public class CommandPatternExample {
public static void main(String[] args) {
// 創(chuàng)建接收者(燈)
Light light = new Light();
// 創(chuàng)建具體命令對象
Command turnOnCommand = new TurnOnLightCommand(light);
Command turnOffCommand = new TurnOffLightCommand(light);
// 創(chuàng)建調(diào)用者(遙控器)
RemoteControl remote = new RemoteControl();
// 綁定打開燈命令并執(zhí)行
remote.setCommand(turnOnCommand);
remote.pressButton(); // 輸出:燈已打開
// 撤銷打開燈命令
remote.pressUndo(); // 輸出:燈已關(guān)閉
// 綁定關(guān)閉燈命令并執(zhí)行
remote.setCommand(turnOffCommand);
remote.pressButton(); // 輸出:燈已關(guān)閉
// 撤銷關(guān)閉燈命令
remote.pressUndo(); // 輸出:燈已打開
}
}
運行結(jié)果
燈已打開
燈已關(guān)閉
燈已關(guān)閉
燈已打開
優(yōu)點
- 降低耦合:命令模式將請求發(fā)送者和實際執(zhí)行者分離。
- 支持擴展:可以輕松增加新的命令,而無需修改已有代碼。
- 支持撤銷和重做:通過命令對象保存操作狀態(tài)。
缺點
- 增加了類的數(shù)量:每個具體命令類都會新增一個類。
- 增加了系統(tǒng)的復雜性:特別是當命令較多時。
總結(jié)
命令模式通過將請求封裝為命令對象,使得請求的發(fā)出者和接收者之間完全解耦。它特別適合在需要支持操作撤銷、請求排隊等功能的場景中應用。

浙公網(wǎng)安備 33010602011771號