C++ 設計模式之命令模式

m_wordPlan發表於2020-11-13

目錄

 

1. 設計目的

2. 設計原理

3. UML設計

4. 程式碼實現

5. 總結


1. 設計目的

將傳送者操作與接收者邏輯作解耦,使接收者的輸出結果更加的靈活多變。比如,UI介面操作, UI(傳送者)點選5s後顯示按鈕, 直接呼叫就需要改寫顯示邏輯物件,新增5s後顯示的方法;可如果新增個命令物件,將UI的命令打包給命令物件,那麼就可以把5s延時在命令物件裡新增,而不用修改顯示物件,這樣顯示物件的職能更單一。

2. 設計原理

a) 在傳送者與接收者之間新增一個命令管理物件(Invoker)和命令類. 傳送者操作命令管理物件,名利管理物件管理命令類例項.命令類關聯到接受者.

b) 命令類是一系列抽象關係的命令類.如, copyCommand, pasteCommand...,命令類物件只用接受者物件和所執行命令的攜帶引數來初始化.且只有一個execute()執行函式. 此方法包含接收者的對應操作.

c) 當傳送者執行命令後, 例項化的命令物件(受命令管理管理)執行execute方法.

3. UML設計

以UI操作編輯器為例:

4. 程式碼實現

程式碼見:https://github.com/luozichao324/Design-Patterns/tree/main/Command/Command

5. 總結

應用場景

a)如果需要通過操作來引數化物件, 可使用命令模式。

b) 如果想要將操作放入佇列中、 操作的執行或者遠端執行操作, 可使用命令模式。同其他物件一樣, 命令也可以實現序列化 (序列化的意思是轉化為字串), 從而能方便地寫入檔案或資料庫中。 一段時間後, 該字串可被恢復成為最初的命令物件。 因此,你可以延遲或計劃命令的執行。 但其功能遠不止如此! 使用同樣的方式, 你還可以將命令放入佇列、 記錄命令或者通過網路傳送命令.

c) 如果想要實現操作回滾功能, 可使用命令模式。儘管有很多方法可以實現撤銷和恢復功能, 但命令模式可能是其中最常用的一種。

為了能夠回滾操作, 你需要實現已執行操作的歷史記錄功能。 命令歷史記錄是一種包含所有已執行命令物件及其相關程式狀態備份的棧結構。

這種方法有兩個缺點。 首先, 程式狀態的儲存功能並不容易實現, 因為部分狀態可能是私有的。 你可以使用備忘錄模式來在一定程度上解決這個問題。其次, 備份狀態可能會佔用大量記憶體。 因此, 有時你需要藉助另一種實現方式: 命令無需恢復原始狀態, 而是執行反向操作。 反向操作也有代價: 它可能會很難甚至是無法實現。

相關文章