命令模式:
將一個請求封裝爲一個對象,從而讓咱們可用不一樣的請求對客戶進行參數化;
對請求排隊或者記錄請求日誌,以及支持可撤銷的操做。
命令模式是一種對象行爲型模式,其別名爲動做(Action)模式或事務(Transaction)模式。java
結構圖:
markdown
示例類圖:
ide
示例代碼:this
// 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();
}
}
角色:spa
Command(抽象命令類):
抽象命令類通常是一個抽象類或接口,在其中聲明瞭用於執行請求的execute()等方法,經過這些方法能夠調用請求接收者的相關操做。設計
ConcreteCommand(具體命令類):
具體命令類是抽象命令類的子類,實現了在抽象命令類中聲明的方法,它對應具體的接收者對象,將接收者對象的動做綁定其中。
在實現execute()方法時,將調用接收者對象的相關操做(Action)。日誌
Invoker(調用者):
調用者即請求發送者,它經過命令對象來執行請求。一個調用者並不須要在設計時肯定其接收者,所以它只與抽象命令類之間存在關聯關係。
在程序運行時能夠將一個具體命令對象注入其中,再調用具體命令對象的execute()方法,從而實現間接調用請求接收者的相關操做。code
Receiver(接收者):
接收者執行與請求相關的操做,它具體實現對請求的業務處理。對象
步驟:接口
優勢
1.下降對象之間的耦合度。
2.新的命令能夠很容易地加入到系統中。
3.能夠比較容易地設計一個組合命令。