java設計模式之命令模式

2021-06-23 04:03:10 字數 2523 閱讀 8787

意圖:將乙個請求封裝為乙個物件,從而可用不同的請求對客戶進行引數化;對請求排隊或記錄日誌,以及支援可撤銷的操作

動機:將」發出請求的物件」和」接收與執行這些請求的物件」分隔開來。

效果: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)、某invoker物件儲存該concretecommand物件

3)、該invoker通過呼叫command物件的execute操作來提交乙個請求。若該命令是可撤銷的,concretecommand在執行execute操作前儲存當前狀態以用於取消該命令

4)、concretecommand物件呼叫它的receiver的操作以執行該請求

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

例項:1 package com.test.patten.command;

2 3 /**

4  * 命令介面

5  */

6 public inte***ce command

1 package com.test.patten.command;

2 3 /**

4  * 命令

5  */

6 public class createcommand implements command

13 14     @override

15     public void execute()

18 19     @override

20     public void undo()

23     

24 }

1 package com.test.patten.command;

2 3 /**

4  * 命令接收者,命令真正執行人

5  */

6 public class receiver

10     

11     public void unaction()

14 }

1 package com.test.patten.command;

2 3 public class invoker

16     public command getcommand()

19 20     /**

21      * 執行命令

22      */

23     public void runcommand()

26     /**

27      * 撤銷命令

28      */

29     public void undocommand()

32 }

1 package com.test.patten.command;

2 3 public class client

18 }

常見應用:

1、工作佇列,執行緒池,日程安排

2、日誌請求(系統恢復)

要點:1、命令模式將發出請求的物件和執行請求的物件解耦

2、在被解耦的兩者之間是通過命令物件進行溝通的。命令物件封裝了接收者和乙個或一組動作

3、呼叫者通過呼叫命令物件的execute()發出請求,這會使得接收者的動作被呼叫

4、呼叫者可以接受命令當作引數,甚至在執行時動態的進行

5、命令可以支援撤銷,做法是實現乙個undo()方法來回到execute()被執行前的狀態

6、巨集命令是命令的一種簡單的延伸,允許呼叫多個命令。巨集方法也可以支援撤銷

7、實際操作時,很常見使用"聰明"命令物件,也就是直接實現了請求,而不是將工作委託給接受者(弊端?)

8、命令也可以用來實現日誌和事物系統

java設計模式之命令模式

定義 把方法呼叫封裝起來,命令模式請求或者操作封裝到乙個物件之中,呼叫的物件需要知道是如何實現的,只要明白如何使用就好。應用場景 記錄日誌,是用這些命令實現撤銷或者恢復的 命令模式對命令進行封裝,發出和執行分派給兩個不同的物件 把請求命令和執行命令分開了 這樣做的好處是 a 便於新的命令加入 b 命...

設計模式之命令模式(java)

命令模式,其實就是進一步封裝,把方法呼叫封裝起來,head first中舉了乙個很生動的例子,飯店中點餐的流暢如下 客戶點了訂單並交給服務端,然後女招待把訂單交給大廚的師傅,大師傅最後呈現出一道可口的菜餚。在這個過程中,客戶只需要知道來飯店點好選單就可以等吃飯了,服務員也是只需要知道把訂單交給大廚,...

Java 設計模式之命令模式

一 了解命令模式 1.1 什麼是命令模式 命令模式將 請求 封裝成物件,以便使用不同的請求 佇列或者日誌來引數化其他物件。命令模式也支援可撤銷的操作。這種說法比較難以理解,換種說法就是指 在軟體系統中,行為請求者 與 行為實現者 通常呈現一種 緊耦合 但在某些場合,比如要對行為進行 記錄 撤銷 重做...