說說設(shè)計模式~命令模式(command)
概述
命令模式(Command Pattern)是一種行為型設(shè)計模式,它將請求封裝成一個對象,從而允許我們根據(jù)不同的請求將客戶端參數(shù)化,并且能夠?qū)⒄埱笈抨牷蛴涗浾埱笕罩尽⒅С殖蜂N操作等。該模式使得請求的發(fā)送者和接收者解耦。
使用命令模式的主要目的是將方法調(diào)用封裝成對象,這樣可以在不同的上下文中使用不同的請求、隊列或日志來參數(shù)化其他對象。這使得請求的發(fā)送者和接收者之間的耦合度降低,并且能夠靈活地擴展和變化請求的處理。
包含的對象
命令模式的主要參與者包括:
- Command(命令):聲明執(zhí)行操作的接口,通常包含執(zhí)行方法
execute()。 - ConcreteCommand(具體命令):實現(xiàn)
Command接口,將一個接收者對象綁定于一個動作,并實現(xiàn)執(zhí)行方法。 - Receiver(接收者):執(zhí)行命令的相關(guān)操作,是具體業(yè)務(wù)邏輯的實際執(zhí)行者。
- Invoker(調(diào)用者):發(fā)出具體命令并要求命令執(zhí)行請求的對象。
- Client(客戶端):創(chuàng)建具體命令對象并設(shè)置其接收者。
在代碼中的體現(xiàn)
以下是一個使用命令模式的簡單示例,以控制電燈的開關(guān)操作為例:
- 定義命令接口和具體命令類:
// Command(命令)
public interface Command {
void execute();
}
// ConcreteCommand(具體命令)
public class LightOnCommand implements Command {
private Light light;
public LightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOn();
}
}
- 定義接收者類:
// Receiver(接收者)
public class Light {
public void turnOn() {
System.out.println("Light turned on");
}
public void turnOff() {
System.out.println("Light turned off");
}
}
- 定義調(diào)用者類:
// Invoker(調(diào)用者)
public class RemoteControl {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void pressButton() {
command.execute();
}
}
- 客戶端代碼示例:
// Client(客戶端)
public class Main {
public static void main(String[] args) {
// 創(chuàng)建接收者對象
Light light = new Light();
// 創(chuàng)建具體命令對象并設(shè)置接收者
Command lightOnCommand = new LightOnCommand(light);
// 創(chuàng)建調(diào)用者對象并設(shè)置命令
RemoteControl remoteControl = new RemoteControl();
remoteControl.setCommand(lightOnCommand);
// 執(zhí)行命令
remoteControl.pressButton();
}
}
在上述示例中,命令模式的主要參與者包括 Command 接口和 LightOnCommand 具體命令類。Light
類作為接收者執(zhí)行實際的命令操作。RemoteControl 類作為調(diào)用者負責(zé)接收命令并執(zhí)行。客戶端代碼創(chuàng)建接收者對象、具體命令對象和調(diào)用者對象,并將它們組合在一起進行命令的執(zhí)行。
通過命令模式,我們可以將控制電燈開關(guān)的操作封裝成一個命令對象,使得命令的發(fā)送者和接收者解耦,且能夠動態(tài)地設(shè)置命令并執(zhí)行。這樣的設(shè)計可以方便地擴展和修改命令的處理邏輯,以及支持命令的撤銷和重做操作等。
回到目錄
浙公網(wǎng)安備 33010602011771號