城市獵人

          在一網情深的日子里,誰能說得清是苦是甜,只知道確定了就義無反顧
          posts - 1, comments - 7, trackbacks - 0, articles - 89

          模式(六):命令(Command)模式

          Posted on 2008-07-24 17:20 sailor 閱讀(215) 評論(0)  編輯  收藏 所屬分類: 模式

          定義
              將“請求”封裝成對象,以便使用不同的請求、隊列或者日志來參數化其他對象。命令模式也支持可撤銷的操作。

          要點
              命令模式將發出請求的對象和接受請求的對象解耦;

              在被解耦的兩者之間是通過命令對象進行溝通的。命令對象封裝了接收者和一個或者一組對象;

              調用者通過調用命令對象的execute()發出請求,這會使得接受者的動作被調用;

              調用者可以接受命令當作參數,甚至在運行時動態地進行;

              命令也可以實現日志和實務系統。


          所涉及的角色:
          1.客戶(Client)角色:
          創建一個具體對象及其確定接收者.
          2.命令(Command)角色:聲明了一個給所有具體命令類的抽象接口。
          3.具體命令(ConcreteCommand)角色:定義一個接收者與行為之間的弱耦合,實現exceute()方法,負責調用接收者的相應操作
          4.請求者(Invoker)角色:
          負責調用命令對象執行請求。
          5.接收者(Recevice)角色:負責具體實施與執行一個請求。
          commmand.bmp
          優點:
          解耦了發送者和接受者之間聯系。 發送者調用一個操作,接受者接受請求執行相應的動作,因為使用Command模式解耦,發送者無需知道接受者任何接口。

          命令模式創建的一般步驟
          1.客戶端創建一個ConcreteCommand對象,并指明接收者。
          2.請求對象保持ConcreteCommand對象。
          3.請求對象通過調用action方法發出請求,若命令是可撤消,則ConcreteCommand保存execute()方法執行前的狀態。
          4.ConcreteCommand對象調用接收的方法執行請求。

          實例
          抽象命令接口:

          package command;
          public interface Command{
              
          //執行方法
               void execute();
          }

          具體命令

          package command;
          public class ConcreteCommand implements Command{
              
          //接收者
              private Receiver receiver;
              
          //構造方法
              public ConcreteCommand(Receiver receiver){
                  
          this.receiver=receiver;
              }

              
          //執行方法
              public void execute(){
                  receiver.action();
              }

          }

          接收者:

          package command;
          public  class Receiver {
              
          //構造方法
              public Receiver(){};
              
          //行為方法
              public void action(){
                  System.out.println(
          "Action is taken here");
              }

          }

          請求者:

          package command;
          public class Invoker{
              
          //命令
              private Command command;
              
          //構造方法
              public Invoker(Command command){
                  
          this.command=command;
              }

              
          //行為方法
              public void action(){
                  command.execute();
              }

          }

          客戶端:

          package command;
          public class Client{
              
          public static void main(String[] args){
                  Receiver receiver
          =new Receiver();
                  Command concreteCommand
          =new ConcreteCommand(receiver);
                  Invoker invoker
          =new Invoker(concreteCommand);
                  invoker.action();
              }

          }

          命令模式與責任鏈模式區別:
          責任鏈模式使一個特定的請求接收對象對請求與命令的執行變得不確定性.而命令模式使得一個特定的對象對命令的執行變得明顯與確定.

          參考資料:《First Head 設計模式》
                                  設計模式學習筆記(十五)--------命令(Command)模式

          主站蜘蛛池模板: 渭源县| 阿拉善右旗| 永登县| 安达市| 苏尼特右旗| 石屏县| 哈尔滨市| 湖南省| 交城县| 松阳县| 伊吾县| 钟祥市| 临夏市| 舟曲县| 会理县| 西平县| 新蔡县| 巴彦县| 阿巴嘎旗| 安新县| 买车| 柞水县| 兴山县| 义乌市| 工布江达县| 安龙县| 尚志市| 广西| 宝兴县| 平山县| 云安县| 富阳市| 白河县| 乌拉特前旗| 兴仁县| 延安市| 武强县| 芦山县| 剑河县| 申扎县| 八宿县|