19.Command-命令模式

Command 命令模式

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

  • 結構圖:
    Command_structure

  • 示例類圖:
    Command_uml

  • 示例代碼:

// 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();
    }
}
  • 角色:

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

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

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

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

  • 步驟:

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

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

  • 缺點
    使用命令模式可能會導致某些系統有過多的具體命令類。因爲針對每一個命令都需要設計一個具體命令類,
    因此某些系統可能需要大量具體命令類,這將影響命令模式的使用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章