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

承接Qt/C++軟件開發項目,高質量交付,靈活溝通,長期維護支持。需求所尋,技術正適,共創完美,歡迎私信聯系!

一、命令模式的說明

????????命令模式(Command Pattern)是一種行為設計模式,它允許將請求封裝成對象,從而使得可以將請求參數化、隊列化、并且可以用不同的請求來參數化客戶端(調用者)的對象。這個模式也支持可撤銷的操作。

命令模式通常包括以下幾個角色:

????????Command(命令): 定義了執行操作的接口,通常包括執行方法(execute())和可能的撤銷方法(undo())。

????????ConcreteCommand(具體命令): 實現了Command接口,持有執行操作所需的相關信息,包括對接收者對象的引用。

????????Invoker(調用者): 請求的發送者,通過命令對象來執行請求。

????????Receiver(接收者): 實際執行操作的對象。

二、命令模式的場景

????????命令模式在實際應用中有很多常見的案例,以下是其中一些常用的情況:

????????菜單和按鈕操作:在圖形用戶界面(GUI)應用程序中,菜單項和按鈕通常可以被抽象為命令對象。當用戶點擊菜單項或按鈕時,相應的命令被執行,這樣做的好處是可以將用戶操作與具體的執行操作解耦。

????????多級撤銷(Undo)操作:命令模式支持撤銷操作,因此它在需要實現撤銷多個步驟的應用程序中很有用。每個命令對象可以保存執行操作的狀態,以便在撤銷時恢復到先前的狀態。

????????任務調度器:命令模式可以用于實現任務調度器,其中每個任務可以被封裝成一個命令對象,并且可以按照一定的順序執行。

????????日志記錄:命令模式可以用于實現日志記錄系統,每個命令對象的執行都可以被記錄下來,從而實現日志記錄功能。

????????遙控器和家電控制:像前面示例中的遙控器一樣,命令模式常用于實現遙控器和家電的控制系統。每個按鈕可以關聯一個命令對象,當按下按鈕時,執行相應的命令。

????????數據庫事務處理:在數據庫操作中,命令模式可以用于實現事務處理,每個數據庫操作可以被封裝成一個命令對象,事務的提交或回滾可以看作是對一系列命令對象的執行或撤銷。

三、命令模式的優缺點

優點:

????????解耦調用者和接收者:命令模式通過將請求封裝成獨立的命令對象,從而解耦了請求的發送者和接收者。這使得系統中的對象不需要知道彼此的細節,降低了對象之間的耦合度,提高了系統的靈活性。

????????支持撤銷和重做:由于命令對象通常會保存執行所需的狀態信息,因此可以很容易地支持撤銷和重做操作。這對于實現撤銷歷史記錄、撤銷棧等功能非常有用。

????????支持命令的排隊執行:命令模式可以將請求排隊,并按照一定的順序執行。這對于實現任務調度器等功能很有用。

????????容易擴展:通過添加新的命令類和接收者類,可以很容易地擴展命令模式,而不需要修改現有的代碼。這樣使得系統更加靈活和可擴展。

????????中心化控制:命令模式將請求封裝成對象,使得可以在系統中集中控制命令的執行。這樣可以更好地管理和維護系統的行為。

缺點:

????????類爆炸:如果系統中有大量的命令類和接收者類,可能會導致類的數量急劇增加,從而增加了系統的復雜性。

????????可能引入過多的代碼:在某些情況下,引入命令模式可能會增加過多的代碼量,特別是對于簡單的功能而言,直接調用函數可能更加簡單和直接。

????????增加了系統的復雜性:命令模式增加了系統中的額外的抽象層次,可能會增加系統的理解和維護成本。

????????不適用于所有情況:命令模式并不適用于所有的情況,特別是對于簡單的功能而言,引入命令模式可能會顯得過于復雜。

????????可能降低執行效率:由于命令模式需要將請求封裝成對象,可能會導致額外的性能開銷,特別是在系統需要頻繁創建和銷毀命令對象的情況下。

四、命令模式的代碼

#include <iostream>
#include <string>
#include <memory>// Command Interface
class Command {
public:virtual ~Command() {}virtual void execute() = 0;
};// Receiver
class Light {
public:void turnOn() {std::cout << "Light is on\n";}void turnOff() {std::cout << "Light is off\n";}
};// Concrete Command
class TurnOnCommand : public Command {
public:TurnOnCommand(std::shared_ptr<Light> light) : m_light(light) {}void execute() override {m_light->turnOn();}
private:std::shared_ptr<Light> m_light;
};class TurnOffCommand : public Command {
public:TurnOffCommand(std::shared_ptr<Light> light) : m_light(light) {}void execute() override {m_light->turnOff();}
private:std::shared_ptr<Light> m_light;
};// Invoker
class RemoteControl {
public:void setCommand(std::shared_ptr<Command> command) {m_command = command;}void pressButton() {m_command->execute();}private:std::shared_ptr<Command> m_command;
};int main() {// Receiverstd::shared_ptr<Light> light = std::make_shared<Light>();// Concrete Commandsstd::shared_ptr<Command> turnOnCommand = std::make_shared<TurnOnCommand>(light);std::shared_ptr<Command> turnOffCommand = std::make_shared<TurnOffCommand>(light);// InvokerRemoteControl remote;// Set commandsremote.setCommand(turnOnCommand);remote.pressButton(); // Output: Light is onremote.setCommand(turnOffCommand);remote.pressButton(); // Output: Light is offreturn 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714109.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714109.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714109.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

跨境代購系統獨立站:掌握核心競爭優勢,打造專業國際購物體驗

跨境代購系統獨立站&#xff08;獲取代購系統獨立站演示&#xff09;的核心競爭優勢可能包括&#xff1a; 獨立性&#xff1a;獨立站不依賴于任何第三方電商平臺&#xff0c;擁有自己的域名和網站空間&#xff0c;可以自主控制網站的設計和內容。靈活性&#xff1a;獨立站不受…

springboot基于web的網上攝影工作室的開發與實現論文

網上攝影工作室 摘要 隨著信息技術在管理上越來越深入而廣泛的應用&#xff0c;管理信息系統的實施在技術上已逐步成熟。本文介紹了網上攝影工作室的開發全過程。通過分析網上攝影工作室管理的不足&#xff0c;創建了一個計算機管理網上攝影工作室的方案。文章介紹了網上攝影工…

微信小程序云開發教程——墨刀原型工具入門(動態組件)

引言 作為一個小白&#xff0c;小北要怎么在短時間內快速學會微信小程序原型設計&#xff1f; “時間緊&#xff0c;任務重”&#xff0c;這意味著學習時必須把握微信小程序原型設計中的重點、難點&#xff0c;而非面面俱到。 要在短時間內理解、掌握一個工具的使用&#xf…

0基礎跨考計算機|408保姆級全年計劃

我也是零基礎備考408&#xff01; 雖說是計算機專業&#xff0c;但是本科一學期學十幾門,真的期末考試完腦子里什么都不進的...基本都是考前一周發瘋學完水過考試...&#x1f605; 想要零基礎跨考可以直接從王道開始&#xff01;跟教材一點一點啃完全沒必要&#x1f978; 現在…

八股文打卡day25——數據庫(2)

面試題&#xff1a;講一下事務的四大特性&#xff1f; 我的回答&#xff1a; ACID A代表原子性&#xff0c;一個事務代表一個業務&#xff0c;要么全部都完成&#xff0c;要么全部都不完成。如果事務執行失敗了&#xff0c;會回滾到最原來的狀態。 C代表一致性&#xff0c;舉…

【STM32】江科大STM32學習筆記匯總(50)

00. 目錄 文章目錄 00. 目錄01. STM32學習筆記匯總02. 相關資料下載03. 附錄 01. STM32學習筆記匯總 【STM32】STM32學習筆記-課程簡介(01) 【STM32】STM32學習筆記-STM32簡介(02) 【STM32】STM32學習筆記-軟件安裝(03) 【STM32】STM32學習筆記-新建工程(04) 【STM32】STM…

venv、pip、conda、anaconda、miniconda的區別和優缺點,和徹底清除python多余的環境

virtualenv(venv) 這是一個虛擬環境管理器&#xff0c;它可以讓你每個項目甚至每個腳本配置一個自定義的Python解釋器環境&#xff0c;這最大的好處是我可以不污染開發環境。? pip pip 是 Python 最常用的包管理器&#xff0c;它能自動處理依賴 。 conda 如果說venv是虛擬…

CSS特性

小技巧&#xff1a;在調試工具中&#xff0c;css樣式上看層疊&#xff0c;下看繼承。 1、層疊性 相同的屬性會被覆蓋&#xff0c;不同的屬性會疊加 2、繼承性 3、優先級 基于不同種類的選擇器的匹配規則。 通配符 < 標簽 < 類選擇器 < id選擇器 < 行內樣式 <…

大語言模型(LLM)技術名詞表(一)

LLMs on a Phone&#xff1a;指在手機設備上運行的大型語言模型。 Scalable Personal AI&#xff1a;指用戶可以在個人設備上對AI模型進行微調的技術。 Responsible Release&#xff1a;發布AI模型時考慮社會、法律和倫理影響的做法。 Multimodality&#xff1a;AI模型能處理…

一起玩兒平衡車(ESP32)——02 平衡車的組裝與接線方法

摘要&#xff1a;本文介紹平衡車的組裝與接線方法 前邊介紹了所要實現的平衡車的組成&#xff0c;接下來就來把小車組裝起來。首先是下層底板的底面要固定兩個輪子。這個只要固定孔位沒有問題&#xff0c;用螺絲直接將輪子支架固定上去就可以了。固定好后如下圖所示&#xff1…

基礎小白快速入門c語言--

變量&#xff1a; 表面理解&#xff1a;在程序運行期間&#xff0c;可以改變數值的數據&#xff0c; 深層次含義&#xff1a;變量實質上代表了一塊兒內存區域&#xff0c;我們可以將變量理解為一塊兒內存區域的標識&#xff0c;當我們操作變量時&#xff0c;相當于操作了變量…

代碼隨想錄算法訓練營Day38|509. 斐波那契數、70. 爬樓梯、746. 使用最小花費爬樓梯

509. 斐波那契數 題目鏈接&#xff1a;509. 斐波那契數 文檔鏈接&#xff1a;509. 斐波那契數 視頻鏈接&#xff1a;手把手帶你入門動態規劃 | LeetCode&#xff1a;509.斐波那契數 C實現 class Solution { public:int fib(int n) {if(n 0) return 0;if(n 1) return 1;int a…

罐頭魚AI傳單功能操作說明|二次剪輯創作|AI智剪|批量剪輯視頻

罐頭魚AI傳單功能操作說明 1. 首頁顯示 賬號登錄狀態 可綁定賬號數量 已綁定賬號數量 已綁定賬號顯示 顯示最近上傳視頻素材 顯示新上傳素材列表 QQ:290615413 2. 抖音賬號綁定功能 顯示登錄賬號 已綁定賬號 可綁定賬號數量 可授權綁定抖音賬號 3. 賬號管理列表 顯…

Netty5 入門HelloWorld

一、客戶端代碼及關鍵類說明 /*** netty5的客戶端* author -zhengzx-**/ public class ClientSocket {public static void main(String[] args) {//服務類Bootstrap bootstrap new Bootstrap();//workerEventLoopGroup worker new NioEventLoopGroup();try {//設置線程池boo…

RC正弦波振蕩電路

RC正弦波振蕩電路 RC正弦波振蕩電路又稱文氏電橋振蕩電路&#xff0c;可以設計頻率為f1/2πRC的正弦波發生器。 RC正弦波振蕩電路設計&#xff1a;50Hz,振幅為3.47V 電路分析&#xff1a; 1.起振條件取決于R1, R4&#xff0c;R2與1N4148并聯電阻&#xff08;下面簡稱Rf&#…

B端系統:OA界面設計,把用戶當傻瓜吧, 少讓用戶吃瓜

OA系統是稍具規模的企業最常用的系統&#xff0c;有些OA系統體驗非常逆天&#xff0c;把用戶當成了吃瓜群眾&#xff0c;看看熱鬧還行&#xff0c;一旦上手操作就抓瞎了&#xff0c;大千UI工場結合自身經驗對這個問題進行分析&#xff0c;希望可以拋磚引玉。 一、OA概述 OA系…

【飛槳EasyDL】飛槳EasyDL發布的模型轉換onnx(附工程代碼)

一個愿意佇立在巨人肩膀上的農民...... 一、paddle轉onnx轉rknn環境搭建 paddle轉onnx和onnx轉rknn兩個環境可以分開搭建&#xff0c;也可以搭建在一起。這里選擇分開搭建&#xff0c;先搭建paddle轉onnx。 1.1、創建環境 選擇python3.8.13包進行創建環境 conda create --nam…

Day09:基礎入門-算法逆向散列對稱非對稱JS源碼逆向AESDESRSASHA

目錄 算法加密-概念&分類&類型 加密解密-識別特征&解密條件 解密實例-密文存儲&數據傳輸 思維導圖 章節知識點&#xff1a; 應用架構&#xff1a;Web/APP/云應用/三方服務/負載均衡等 安全產品&#xff1a;CDN/WAF/IDS/IPS/蜜罐/防火墻/殺毒等 滲透命令&am…

電子科技大學《數據庫原理及應用》(持續更新)

前言 電子科技大學的數據庫課程縮減了部分的課時&#xff0c;因此&#xff0c;可能并不適合所有要學習數據庫的寶子們&#xff0c;但是&#xff0c;本人盡量將所有數據庫的內容寫出來。本文章適用于本科生的期中和期末的復習&#xff0c;電子科技大學的考生請在復習前先看必讀…

MySQL相關知識匯總

MySQL是一個廣泛使用的開源關系型數據庫管理系統&#xff0c;它以其高性能、穩定性和易用性而備受開發者喜愛。在軟件開發領域&#xff0c;無論是大型項目還是小型應用&#xff0c;MySQL都扮演著重要的角色。本文將對MySQL的一些關鍵知識點進行匯總&#xff0c;幫助讀者更好地了…