19.Command-命令模式

Command 命令模式

  • 命令模式:
    將一個請求封裝爲一個對象,從而讓咱們可用不一樣的請求對客戶進行參數化;
    對請求排隊或者記錄請求日誌,以及支持可撤銷的操做。
    命令模式是一種對象行爲型模式,其別名爲動做(Action)模式或事務(Transaction)模式。java

  • 結構圖:
    Command_structuremarkdown

  • 示例類圖:
    Command_umlide

  • 示例代碼: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

    1. Command(抽象命令類):
      抽象命令類通常是一個抽象類或接口,在其中聲明瞭用於執行請求的execute()等方法,經過這些方法能夠調用請求接收者的相關操做。設計

    2. ConcreteCommand(具體命令類):
      具體命令類是抽象命令類的子類,實現了在抽象命令類中聲明的方法,它對應具體的接收者對象,將接收者對象的動做綁定其中。
      在實現execute()方法時,將調用接收者對象的相關操做(Action)。日誌

    3. Invoker(調用者):
      調用者即請求發送者,它經過命令對象來執行請求。一個調用者並不須要在設計時肯定其接收者,所以它只與抽象命令類之間存在關聯關係。
      在程序運行時能夠將一個具體命令對象注入其中,再調用具體命令對象的execute()方法,從而實現間接調用請求接收者的相關操做。code

    4.  Receiver(接收者):
      接收者執行與請求相關的操做,它具體實現對請求的業務處理。對象

  • 步驟:接口

    1. Client建立一個ConcreteCommand對象並指定他的Receiver對象。
    2. 某個Invoker對象存儲該ConcreteCommand對象。
    3. 該Invoker經過調用Command對象的Execute操做來提交一個請求。
      若該命令是可撤銷的,ConcreteCommand就在執行Execute操做以前存儲當前狀態以用於取消該命令。
    4. ConcreteCommand對象對調用它的Receiver的一些操做以執行該請求。
  • 優勢

1.下降對象之間的耦合度。
2.新的命令能夠很容易地加入到系統中。
3.能夠比較容易地設計一個組合命令。

  • 缺點 使用命令模式可能會致使某些系統有過多的具體命令類。由於針對每個命令都須要設計一個具體命令類, 所以某些系統可能須要大量具體命令類,這將影響命令模式的使用。
相關文章
相關標籤/搜索