Java設計模式の命令模式

來源:互聯網
上載者:User

標籤:alt   設計   指定   string   日誌   結構圖   date   委託   create   

意圖:

  將一個請求封裝為一個對象,從而可用不同的請求對客戶進行參數化;對請求排隊或記錄日誌,以及支援可撤銷的操作

動機:

  將”發出請求的對象”和”接收與執行這些請求的對象”分隔開來。

效果:
  1)、command模式將叫用作業的對象和實現該操作的對象解耦
  2)、可以將多個命令裝配成一個複合命令,複合命令是Composite模式的一個執行個體
  3)、增加新的command很容易,無需改變已有的類

適用性:
  1)、抽象出待執行的動作以參數化某對象
  2)、在不同的時刻指定、排列和執行請求。如請求隊列
  3)、支援取消操作
  4)、支援修改日誌
  5)、用構建在原語操作上的高層操作構造一個系統。支援事物

參與者:
 1)、Command
  聲明執行操作的介面
 2)、ConcreteCommand
  將一個接收者對象綁定於一個動作
  調用接收者相應的操作,以實現execute
 3)、Client
  建立一個具體命令對象並設定它的接收者
 4)、Invoker
  要求該命令執行這個請求
 5)、Receiver
  知道如何實施與執行一個請求相關的操作。任何類都可能作為一個接收者

結構圖:

 

協作:
  1)、client建立一個ConcreteCommand對象並指定它的Receiver對象
  2)、某InvokerObject Storage Service該ConcreteCommand對象
  3)、該Invoker通過調用Command對象的execute操作來提交一個請求。若該命令是可撤銷的,ConcreteCommand在執行execute操作前儲存目前狀態以用於取消該命令
  4)、ConcreteCommand對象調用它的Receiver的操作以執行該請求

命令對象將動作和接受者包進對象中,這個對象只暴露出一個execute()方法,當此方法被調用的時候,接收者就會進行這些動作。從外面來看,其他對象不知道究竟哪個接收者進行了哪些動作,只知道如果調用execute()方法,請求的目的就能達到。 

實現源碼:

package com.blankjor.command;/** * @desc 命令介面 * @author Blankjor * @date 2017年5月20日 上午9:49:53 */public interface Command {    /**     * 執行命令     */    void excute();    /**     * 撤銷命令     */    void undo();}package com.blankjor.command;/** * @desc 真正命令執行者,接收者 * @author Blankjor * @date 2017年5月20日 上午9:52:13 */public class Receiver {    public void action() {        System.out.println("正在執行命令...");    }    public void unAction() {        System.out.println("正在撤銷命令...");    }}package com.blankjor.command;/** * @desc 建立命令(可實現多條命令以及多個命令執行人) * @author Blankjor * @date 2017年5月20日 上午9:54:27 */public class CreateCommand implements Command {    private Receiver receiver;    /**     * 初始化命令接收人     *      * @param receiver     */    public CreateCommand(Receiver receiver) {        this.receiver = receiver;    }    @Override    public void excute() {        receiver.action();    }    @Override    public void undo() {        receiver.unAction();    }}package com.blankjor.command;/** * @desc 命令調用者 * @author Blankjor * @date 2017年5月20日 上午9:59:05 */public class Invoker {    private Command command;    /**     * 命令調用者持有該命令     *      * @param command     */    public Invoker(Command command) {        this.command = command;    }    /**     * 執行命令     */    public void runCommand() {        command.excute();    }    /**     * 撤銷命令     */    public void unRunCommand() {        command.undo();    }}package com.blankjor.command;/** * @desc 命令模式測試 * @author Blankjor * @date 2017年5月20日 上午10:02:33 */public class TestMain {    public static void main(String[] args) {        // new 一個命令執行人        Receiver receiver = new Receiver();        // new 一條命令        Command command = new CreateCommand(receiver);        // 開始調用命令        Invoker invoker = new Invoker(command);        invoker.runCommand();        invoker.unRunCommand();    }}

執行結果:

常見應用:
 1、工作隊列,線程池,排程
 2、日誌請求(系統復原)
要點:
 1、命令模式將發出請求的對象和執行請求的對象解耦
 2、在被解耦的兩者之間是通過命令對象進行溝通的。命令對象封裝了接收者和一個或一組動作
 3、調用者通過調用命令對象的execute()發出請求,這會使得接收者的動作被調用
 4、調用者可以接受命令當作參數,甚至在運行時動態進行
 5、命令可以支援撤銷,做法是實現一個undo()方法來回到execute()被執行前的狀態
 6、宏命令是命令的一種簡單的延伸,允許調用多個命令。宏方法也可以支援撤銷
 7、實際操作時,很常見使用"聰明"命令對象,也就是直接實現了請求,而不是將工作委託給接受者(弊端?)
 8、命令也可以用來實現日誌和事物系統

 參考:http://www.cnblogs.com/ikuman/archive/2013/08/06/3233092.html

Java設計模式の命令模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.