JAVA 設計模式 命令模式


用途


 

命令模式 (Command)
將一個請求 封裝為一個對象,從而使你可以用 不同的請求對客戶進行 參數化
對請求排隊或請求日志,以及支持可撤銷的操作。

 

命令模式是一種行為型模式



結構

圖-命令模式結構圖

Command : 用來聲明執行操作的接口。
abstract  class Command {
     protected Receiver receiver;
     public Command(Receiver receiver) {
         this.receiver = receiver;
    }
    
     public  abstract  void Execute();
}

ConcreteCommand : 將一個接收者對象綁定一個動作,調用接收者相應的操作,以實現Execute。

class ConcreteCommand  extends Command {
     public ConcreteCommand(Receiver receiver) {
         super(receiver);
    }

    @Override
     public  void Execute() {
        receiver.Action();
    }
}

Invoker : 要求該命令執行這個請求。

class Invoker {
     private Command command;
    
     public Invoker(Command command) {
         this.command = command;
    }
    
     public  void ExecuteCommand() {
        command.Execute();
    }
}

Receiver : 知道如何實施與執行一個與請求相關的操作,任何類都可能作為一個接收者。

class Receiver {
     public  void Action() {
        System.out.println("執行請求");
    }
}

Client : 創建一個具體命令對象並設定它的接受者。

public  class CommandPattern {
     public  static  void main(String[] args) {
        Receiver receiver =  new Receiver();
        Command cmd =  new ConcreteCommand(receiver);
        Invoker invoker =  new Invoker(cmd);
        invoker.ExecuteCommand();
    }
}


 

交互

圖-命令模式交互圖

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


 

要點
1、命令模式的本質是對命令進行封裝,將發出命令的責任和執行命令的責任分割開。
2、每一個命令都是一個操作:請求的一方發出請求,要求執行一個操作;接收的一方收到請求,並執行操作。
3、命令模式允許請求的一方和接收的一方獨立開來,使得請求的一方不必知道接收請求的一方的接口,更不必知道請求是怎么被接收,以及操作是否被執行、何時被執行,以及是怎么被執行的。
4、命令模式使請求本身成為一個對象,這個對象和其他對象一樣可以被存儲和傳遞。
5、命令模式的關鍵在於引入了抽象命令接口,且發送者針對抽象命令接口編程,只有實現了抽象命令接口的具體命令才能與接收者相關聯。



推薦

本文屬於 JAVA設計模式系列



參考資料

《大話設計模式》

《HeadFirst設計模式》

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM