C++ 設計模式之命令模式
目錄
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) 如果想要實現操作回滾功能, 可使用命令模式。儘管有很多方法可以實現撤銷和恢復功能, 但命令模式可能是其中最常用的一種。
為了能夠回滾操作, 你需要實現已執行操作的歷史記錄功能。 命令歷史記錄是一種包含所有已執行命令物件及其相關程式狀態備份的棧結構。
這種方法有兩個缺點。 首先, 程式狀態的儲存功能並不容易實現, 因為部分狀態可能是私有的。 你可以使用備忘錄模式來在一定程度上解決這個問題。其次, 備份狀態可能會佔用大量記憶體。 因此, 有時你需要藉助另一種實現方式: 命令無需恢復原始狀態, 而是執行反向操作。 反向操作也有代價: 它可能會很難甚至是無法實現。
相關文章
- c/c++設計模式----命令模式C++設計模式
- 設計模式之命令模式設計模式
- 設計模式之-命令模式設計模式
- C++設計模式——命令模式(command pattern)C++設計模式
- Javascript設計模式之命令模式JavaScript設計模式
- C++設計模式之代理模式C++設計模式
- C++設計模式之Proxy模式(代理模式)C++設計模式
- C#設計模式之命令模式C#設計模式
- javascript設計模式 之 6 命令模式JavaScript設計模式
- 設計模式漫談之命令模式設計模式
- JAVA設計模式之 13.命令設計模式Java設計模式
- 折騰Java設計模式之命令模式Java設計模式
- 14.java設計模式之命令模式Java設計模式
- 設計模式(十九)----行為型模式之命令模式設計模式
- 4/24 設計模式之命令設計模式 Command Pattern設計模式
- 每天一個設計模式之命令模式設計模式
- 軟體設計模式系列之十六——命令模式設計模式
- js設計模式–命令模式JS設計模式
- Java設計模式——命令模式Java設計模式
- js設計模式--命令模式JS設計模式
- Python 設計模式-命令模式Python設計模式
- 設計模式-命令模式(Command)設計模式
- Go語言實現設計模式之命令模式Go設計模式
- 【嵌入式c++】設計模式之策略模式(Strategy)C++設計模式
- 設計模式系列 6– 命令模式設計模式
- 設計模式實戰 - 命令模式設計模式
- JavaScript設計模式(七):命令模式JavaScript設計模式
- 簡說設計模式——命令模式設計模式
- 極簡設計模式-命令模式設計模式
- Java設計模式(16)----------命令模式Java設計模式
- GoLang設計模式08 - 命令模式Golang設計模式
- c/c++設計模式---策略模式C++設計模式
- 【C++設計模式】組合模式C++設計模式
- 設計模式之策略模式設計模式
- 設計模式之代理模式設計模式
- 設計模式之Plugin模式設計模式Plugin
- 《設計模式》之代理模式設計模式
- 設計模式之【策略模式】設計模式