Command 命令模式
命令模式:
將一個請求封裝爲一個對象,從而讓我們可用不同的請求對客戶進行參數化;
對請求排隊或者記錄請求日誌,以及支持可撤銷的操作。
命令模式是一種對象行爲型模式,其別名爲動作(Action)模式或事務(Transaction)模式。結構圖:
示例類圖:
示例代碼:
// Command
public interface Command {
public void execute();
}
// Invoker
public class Switch {
private Command onCommand;
private Command offCommand;
public Switch() {
}
public Switch(Command onCommand, Command offCommand) {
this.onCommand = onCommand;
this.offCommand = offCommand;
}
public void on() {
onCommand.execute();
}
public void off() {
offCommand.execute();
}
public void setOnCommand(Command onCommand) {
this.onCommand = onCommand;
}
public void setOffCommand(Command offCommand) {
this.offCommand = offCommand;
}
}
// Receiver
public class Light {
public void on() {
System.out.println("The light is on");
}
public void off() {
System.out.println("The light is off");
}
}
public class LightOnCommand implements Command {
private Light light;
public LightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.on();
}
}
public class LightOffCommand implements Command {
private Light light;
public LightOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.off();
}
}
角色:
Command(抽象命令類):
抽象命令類一般是一個抽象類或接口,在其中聲明瞭用於執行請求的execute()等方法,通過這些方法可以調用請求接收者的相關操作。ConcreteCommand(具體命令類):
具體命令類是抽象命令類的子類,實現了在抽象命令類中聲明的方法,它對應具體的接收者對象,將接收者對象的動作綁定其中。
在實現execute()方法時,將調用接收者對象的相關操作(Action)。Invoker(調用者):
調用者即請求發送者,它通過命令對象來執行請求。一個調用者並不需要在設計時確定其接收者,因此它只與抽象命令類之間存在關聯關係。
在程序運行時可以將一個具體命令對象注入其中,再調用具體命令對象的execute()方法,從而實現間接調用請求接收者的相關操作。Receiver(接收者):
接收者執行與請求相關的操作,它具體實現對請求的業務處理。
步驟:
- Client創建一個ConcreteCommand對象並指定他的Receiver對象。
- 某個Invoker對象存儲該ConcreteCommand對象。
- 該Invoker通過調用Command對象的Execute操作來提交一個請求。
若該命令是可撤銷的,ConcreteCommand就在執行Execute操作之前存儲當前狀態以用於取消該命令。 - ConcreteCommand對象對調用它的Receiver的一些操作以執行該請求。
優點
1.降低對象之間的耦合度。
2.新的命令可以很容易地加入到系統中。
3.可以比較容易地設計一個組合命令。
- 缺點
使用命令模式可能會導致某些系統有過多的具體命令類。因爲針對每一個命令都需要設計一個具體命令類,
因此某些系統可能需要大量具體命令類,這將影響命令模式的使用。