設計模式學習(六)——命令模式

參考書——《HeadFirst設計模式》



命令模式最關鍵的點——將“請求”封裝成對象。使得發出請求的對象(Invoker)接受與執行這些請求的對象Receiver)分隔開來。


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

一個命令對象通過在特定接受者上綁定一組動作來封裝一個請求。要達到這一點,命令對象將動作和接受者包進對象中,這個對象只暴露一個execute()方法,此方法被調用的時候,接受者就會進行這些動作。


Invoker調用者持有一個命令對象,並在某個時間點調用命令對象的execute()方法,將請求付諸實行。

Command爲所以命令聲明瞭一個接口。調用命令對象的execute()方法,就可以讓接受者執行相關的動作。這個接口也具備一個undo()方法。

ConcreteCommand定義了動作和接受者之間的綁定關係。調用者只要調用execute()就可以發出請求,然後由ConcreteCommand調用接受者一個or多個動作。

Receiver知道如何進行必要的工作,實現請求。


應用場景

在下面的情況下應當考慮使用命令模式:

1)使用命令模式作爲"CallBack"在面向對象系統中的替代。(P.s:對於回調的理解——回調是對接口而言。簡單來說就是,A對象調用了自己的方法a,方法a接收的參數是B接口的實例b,而在方法a中將執行b的方法c。)

2)需要在不同的時間指定請求、將請求排隊。一個命令對象和原先的請求發出者可以有不同的生命期。換言之,原先的請求發出者可能已經不在了,而命令對象本身仍然是活動的。這時命令的接收者可以是在本地,也可以在網絡的另外一個地址。命令對象可以在串形化之後傳送到另外一臺機器上去。

3)系統需要支持命令的撤消(undo)。命令對象可以把狀態存儲起來,等到客戶端需要撤銷命令所產生的效果時,可以調用undo()方法,把命令所產生的效果撤銷掉。命令對象還可以提供redo()方法,以供客戶端在需要時,再重新實施命令效果。

4)如果一個系統要將系統中所有的數據更新到日誌裏,以便在系統崩潰時,可以根據日誌裏讀回所有的數據更新命令,重新調用execute()方法一條一條執行這些命令,從而恢復系統在崩潰前所做的數據更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章