1. 程式人生 > >設計模式初探-命令模式(COMMAND),又稱動作(Action),事務(Transaction)

設計模式初探-命令模式(COMMAND),又稱動作(Action),事務(Transaction)

命令模式(COMMAND),又稱動作(Action),事務(Transaction),通過將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化,實現對請求排隊或記錄請求日誌,以及支援可撤銷的操作。命令模式可以將請求傳送者和接收者完全解耦,傳送者與接收者之間沒有直接引用關係,傳送請求的物件只需要知道如何傳送請求,而不必知道如何完成請求。

一、使用場景

1、需要抽象出待執行的動作以引數化某物件時。這種引數化機制在過程語言中是通過回撥函式表示式實現的,Command模式則是回撥機制的一個面向物件的替代品。

2、在不同的時刻指定、排列和執行請求。一個Command物件可以有一個與初始請求無關的生存期,你完全可以將請求的命令物件傳遞給另一個不同的程序並在那實現該請求。

3、支援取消操作。在Command的execute操作執行前將狀態儲存到一個歷史列表中,通過向後和向前遍歷該列表並分別呼叫undo和redo方法來實現數量不限的“取消”和"重做"。

4、支援修改日誌,當系統崩潰時可以用於修改的重做,以便復原崩潰前狀態。在Command介面中可以加入裝載和儲存操作,用來將系統修改持久化到日誌檔案。系統恢復只需從日誌檔案中讀入修改記錄,然後使用Command的execute重新執行它們即可。

5、用構建在原語操作上的高層操作構造一個系統,比如支援事務的資訊系統。一個事務封裝了對資料的一組變動,Command模式提供了對事務進行建模的方法。Command提供的公共的介面,可以用來以一致的方式呼叫所有事務。同時使用命令模式也易於新增新事務以擴充套件系統。

二、UML圖

命令模式uml

注:   命令模式的關鍵在於引入了抽象命令類,請求傳送者針對抽象命令類程式設計,只有實現了抽象命令類的具體命令才與請求接收者相關聯。

三、Java實現

  1. package study.patterns.command;  
  2. import java.util.ArrayList;  
  3. import java.util.List;  
  4. /** 
  5.  * 命令模式的本質是對請求進行封裝,一個請求對應於一個命令,將發出命令的責任和執行命令的責任分割開。 
  6.  * 每一個命令都是一個操作:請求的一方發出請求要求執行一個操作;接收的一方收到請求,並執行相應的操作。 
  7.  * 命令模式允許請求的一方和接收的一方獨立開來,使得請求的一方不必知道接收請求的一方的介面,
     
  8.  * 更不必知道請求如何被接收、操作是否被執行、何時被執行,以及是怎麼被執行的。 
  9.  * @author qbg 
  10.  */
  11. publicclass CommandPattern {  
  12.     publicstaticvoid main(String[] args) {  
  13.         //請求接收者(ReceiverA)封裝到具體的命令物件(ConcreteCommandA)中,與請求傳送者(CommandPattern)分離。
  14.         Command comA = new ConcreteCommandA();  
  15.         Command comB = new ConcreteCommandB();  
  16.         Command macro = new MacroCommand();  
  17.         macro.addCommand(comA);  
  18.         macro.addCommand(comB);  
  19.         macro.execute();  
  20.         macro.undo();  
  21.         macro.redo();  
  22.         macro.writeLog("config.log");  
  23.         macro.readLog("config.log");  
  24.     }  
  25. }  
  26. /** 
  27.  * 抽象命令:採用組合模式實現巨集命令(類似於批處理命令,可以執行一批命令)  
  28.  */
  29. interface Command{  
  30.     /** 
  31.      * 新增命令(組合模式) 
  32.      * @param command 
  33.      */
  34.     publicvoid addCommand(Command command);  
  35.     /** 
  36.      * 刪除命令(組合模式) 
  37.      * @param command 
  38.      */
  39.     publicvoid removeCommand(Command command);  
  40.     /** 
  41.      * 撤銷(撤銷上次操作) 
  42.      */
  43.     publicvoid undo();  
  44.     /** 
  45.      * 重做(重做上次操作) 
  46.      */
  47.     publicvoid redo();  
  48.     /** 
  49.      * 執行命令 
  50.      */
  51.     publicvoid execute();  
  52.     /** 
  53.      * 從指定檔案讀取執行命令,以待重新執行 
  54.      * @param fileName 
  55.      */
  56.     publicvoid readLog(String fileName);  
  57.     /** 
  58.      * 將執行過的命令持久化檔案中,以待災難恢復 
  59.      * @param fileName 
  60.      */
  61.     publicvoid writeLog(String fileName);  
  62. }  
  63. /** 
  64.  * 預設實現類,不提供任何實現  
  65.  */
  66. class DefaultCommand implements Command{  
  67.     @Override
  68.     publicvoid addCommand(Command command) {  
  69.         thrownew IllegalAccessError("方法未實現");  
  70.     }  
  71.     @Override
  72.     publicvoid removeCommand(Command command) {  
  73.         thrownew IllegalAccessError("方法未實現");  
  74.     }  
  75.     @Override
  76.     publicvoid undo() {  
  77.         thrownew IllegalAccessError("方法未實現");  
  78.     }  
  79.     @Override
  80.     publicvoid redo() {  
  81.         thrownew IllegalAccessError("方法未實現");  
  82.     }  
  83.     @Override
  84.     publicvoid execute() {  
  85.         thrownew IllegalAccessError("方法未實現");  
  86.     }  
  87.     @Override
  88.     publicvoid readLog(String fileName) {  
  89.         thrownew IllegalAccessError("方法未實現");  
  90.     }  
  91.     @Override
  92.     publicvoid writeLog(String fileName) {  
  93.         thrownew IllegalAccessError("方法未實現");  
  94.     }  
  95. }  
  96. /** 
  97.  * 命令接收者A,具體業務處理  
  98.  */
  99. class ReceiverA{  
  100.     publicvoid action(){  
  101.         System.out.println("ReceiverA:do something....");  
  102.     }  
  103. }  
  104. /** 
  105.  * 命令接收者B,具體業務處理  
  106.  */
  107. class ReceiverB{  
  108.     publicvoid action(){  
  109.         System.out.println("ReceiverB:do something....");  
  110.     }  
  111. }  
  112. /** 
  113.  * 具體命令實現,覆蓋預設命令類的execute() 
  114.  */
  115. class ConcreteCommandA extends DefaultCommand{  
  116.     private ReceiverA receiver = new ReceiverA();  
  117.     @Override
  118.     publicvoid execute() {  
  119.         receiver.action();  
  120.     }  
  121.     @Override
  122.     public String toString(){  
  123.         return"ConcreteCommandA ";  
  124.     }  
  125. }  
  126. /** 
  127.  * 具體命令實現,覆蓋預設命令類的execute() 
  128.  */
  129. class ConcreteCommandB extends DefaultCommand{  
  130.     private ReceiverB receiver = new ReceiverB();  
  131.     @Override
  132.     publicvoid execute() {  
  133.         receiver.action();  
  134.     }  
  135.     @Override
  136.     public String toString(){  
  137.         return"ConcreteCommandB ";  
  138.     }  
  139. }  
  140. /** 
  141.  * 巨集命令:使用組合模式和命令模式,批量執行命令  
  142.  */
  143. class MacroCommand implements Command{  
  144.     private List<Command> commands = new ArrayList<Command>();  
  145.     @Override
  146. 相關推薦

    設計模式初探-命令模式(COMMAND)動作(Action)事務(Transaction)

    命令模式(COMMAND),又稱動作(Action),事務(Transaction),通過將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化,實現對請求排隊或記錄請求日誌,以及支援可撤銷的操作。命令模式可以將請求傳送者和接收者完全解耦,傳送者與接收者之間沒有

    設計模式命令模式(Command)摘錄

    single 而是 names 都得 結構 意圖 iterator nbsp 軟件 23種GOF設計模式一般分為三大類:創建型模式、結構型模式、行為模式。創建型模式抽象了實例化過程,它們幫助一個系統獨立於怎樣創建、組合和表示它的那些對象。一個類創建型模式使用繼承改變被實例

    設計模式命令模式 Command

    sta clas ide class open cli private 2017年 命令模式 介紹 角色 使用場景 代碼實現 public interface Command { //這個方法是一個返回結果為空的方法 //實際項目中,可

    設計模式命令Command模式

    box exe see 再次 clas sed hist 本質 private 設計模式:命令(Command)模式 一、前言 命令也是類,將命令作為一個類來保存,當要使用的時候可以直接拿來使用,比如腳本語言寫出的腳本,只需要一個命令就能執行得到我們想要的需要操作很長時

    C#設計模式(15)——命令模式Command Pattern)

    兩個 學院 做的 text server trac handle 接受 color 一、前言   之前一直在忙於工作上的事情,關於設計模式系列一直沒更新,最近項目中發現,對於設計模式的了解是必不可少的,當然對於設計模式的應用那更是重要,可以說是否懂得應用設計模式在項目中是衡

    設計模式命令模式Command Pattern)

    摘要 命令模式(Command Pattern)是一種資料驅動的設計模式,它屬於行為型模式。請求以命令的形式包裹在物件中,並傳給呼叫物件。呼叫 介紹 意圖:將一個請求封裝成一個物件,從而使您可以用不同的請求對客戶進行引數化。 主要解決:在軟體系統中,行為請求者與行為實現者通常是一種緊

    二十三種設計模式[14] - 命令模式(Command Pattern)

    前言        命令模式,物件行為型模式的一種。它幫助我們將功能的呼叫者與實現者之間解耦(甚至完全解耦)。呼叫者與實現者之間並不是直接引用關係,呼叫者只需要知道如何傳送當前功能的請求即可,而不用關心該請求由誰在何時完成。   

    設計模式命令模式(Command Pattern)

    命令模式定義 命令模式是一個高內聚的模式。Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requ

    設計模式命令模式Command Pattern)

    /** * 命令模式。 * @author Bright Lee */ public class CommandPattern { public static void main(String[] args) { Receiver receiver = new Receiver

    C++設計模式10--命令模式(二)(Command)--降低請求傳送者與接收者耦合

      工作了一天感覺好累,洗了個澡,開啟電視看看有沒有喜歡的節目,拿起遙控器,看著上面的按鈕,忽然感覺好奇妙,我們按一開機鍵,電視就開了,然後...哈哈,真好玩,我按我按。細想之下這不就是一個命令模式麼。 電視機是請求的接收者Receiver, 遙控器是請求的傳送者Concr

    設計模式命令模式(command pattern)

    名稱:命令模式 說說:這其實和小時候我們傳紙條是一樣一樣的,一張紙條代表一條命令 動機: 適用性: 參與者: 結果:將一個請求封裝為一個物件 類圖: 說明:一個命令(請求)就是一個例項(命令物件 = 動作的執行者 + 要執行的行為),傳送一個命令就是傳遞一個命令引數。 d

    設計模式命令模式Command Pattern)

    命令模式 命令模式(Command Pattern)是一種資料驅動的設計模式,它屬於行為型模式。請求以命令的形式包裹在物件中,並傳給呼叫物件。呼叫物件尋找可以處理該命令的合適的物件,並把該命令傳給相應的物件,該物件執行命令。 介紹 意圖:將一個請求封裝成一個物件,

    設計模式命令Command模式

         Command定義如下: 將來自客戶端的請求傳入一個物件,無需瞭解這個請求啟用的動作或有關接受這個請求的處理細節。是不是有點迷糊。不知其說的是啥。哈哈。彆著急下面聽我慢慢到來。本人覺得,命令模式就是把一些具體的命令封裝成一此具體的類,這此類實現同一個介面或者是抽象類

    設計模式-15命令模式(Command Pattern)

    # 1.模式動機 在軟體設計中,我們經常需要向某些物件傳送請求,但是並不知道請求的接收者是誰,也不知道被請求的操作是哪個,我們只需在程式執行時指定具體的請求接收者即可,此時,可以使用命令模式來進行設計,使得請求傳送者與請求接收者消除彼此之間的耦合,讓物件之間的呼叫關係更加靈活。 命令模式可以對傳送者和接收者

    設計模式命令模式

    能夠 ger 不同 exec cor del 需要 content ces 設計模式之命令模式 Feb 24, 2015 命令模式(Command)的定義是:用於將一個請求封裝成一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或者記錄請求日誌,以及執行可撤銷的

    設計模式-12-命令模式

    rod arraycopy ati length pre interface user 經理 this 簡介:以對象來代表實際行動,命令對象可以把行動(action) 及其參數封裝起來,這些行動可以被 重復多次 取消(如果該對象有實現的話) 取消後又再重做 目的: 總結

    15.設計模式_命令模式

    console 註冊 返回 隊列 過程 適用場景 參數 是把 get請求 一、前言   之前一直在忙於工作上的事情,關於設計模式系列一直沒更新,最近項目中發現,對於設計模式的了解是必不可少的,當然對於設計模式的應用那更是重要,可以說是否懂得應用設計模式在項目中是衡量一個程序

    我的設計模式命令模式

    命令模式命令模式 Command Pattern問題: 開發組 客戶 美工組 組 需求組 客戶把美工叫過去了,要刪除,可美工說需求是這麽寫的,然後客戶又命令需q求組過去,客戶不高興了(客戶就是上帝,不能不高興啊)。 客戶需要認識這

    java設計模式命令模式

    int aud 按鍵 設計 oid 定義 bsp class 命令 命令模式:   對命令的封裝,把發出命令的責任和執行命令的責任分割開,委派給不同的對象。 命令模式涉及到五個角色: 客戶端(CommandMain)角色:創建一個具體命令並確定接收者(觸發錄音機按

    Java進階篇設計模式之八 ----- 責任鏈模式命令模式

    如果能 clean branch pcm tle 開始 類型 mar www 前言 在上一篇中我們學習了結構型模式的享元模式和代理模式。本篇則來學習下行為型模式的兩個模式, 責任鏈模式(Chain of Responsibility Pattern)和命令模式(Comman