(十 五)趣學設計模式 之 命令模式!

在這里插入圖片描述

目錄

    • 一、 啥是命令模式?
    • 二、 為什么要用命令模式?
    • 三、 策略模式的實現方式
    • 四、 命令模式的優缺點
    • 五、 命令模式的應用場景
    • 六、 總結

🌟我的其他文章也講解的比較有趣😁,如果喜歡博主的講解方式,可以多多支持一下,感謝🤗!
🌟了解策略模式請看: (十 四)趣學設計模式 之 策略模式!
?更多請看個人主頁: 碼熔burning

這篇文章帶你詳細認識一下設計模式中的命令模式

一、 啥是命令模式?

想象一下,你正在使用遙控器 🕹? 控制電視機 📺。 你可以按下不同的按鈕來執行不同的操作:開機、關機、換臺、調節音量等等。 遙控器本身并不執行這些操作,而是將這些操作封裝成一個個命令,然后發送給電視機去執行。

命令模式,就是用來解決請求發送者和接收者之間耦合的問題! 它可以將請求封裝成一個對象,從而解耦發送者和接收者,并支持命令的排隊、撤銷和重做 🎁。

簡單來說,就是把請求封裝成對象,讓發送者和接收者互不干擾!

  • 你需要將請求的發送者和接收者解耦: 就像你需要讓遙控器和電視機互不干擾 🕹?📺!
  • 你需要支持命令的排隊、撤銷和重做: 就像你需要支持遙控器的撤銷和重做功能 ??!
  • 你需要將多個操作組合成一個宏命令: 就像你需要將多個操作組合成一個一鍵換臺功能 🔢!

二、 為什么要用命令模式?

用命令模式,好處多多 👍:

  • 解耦發送者和接收者: 發送者不需要知道接收者的具體實現,只需要知道如何發送命令 🤝!
  • 支持命令的排隊、撤銷和重做: 可以將命令存儲起來,方便后續的撤銷和重做 ??!
  • 支持宏命令: 可以將多個命令組合成一個宏命令,一次性執行多個操作 🔢!
  • 提高代碼的靈活性: 可以動態地添加和刪除命令,使得代碼更加靈活 🤸!

三、 策略模式的實現方式

命令模式主要包含四個核心概念:

  • 命令接口(Command): 定義了命令的接口,聲明了所有命令都需要實現的方法 🤝!
  • 具體命令類(ConcreteCommand): 實現了命令接口,封裝了具體的請求 ??!
  • 調用者(Invoker): 持有命令接口的引用,負責在合適的時候調用命令 🕹?!
  • 接收者(Receiver): 負責執行具體的請求 📺!
// 命令接口:命令
public interface Command {void execute(); // 執行命令void undo(); // 撤銷命令
}// 具體命令類:開機命令
public class OnCommand implements Command {private TV tv; // 電視機public OnCommand(TV tv) {this.tv = tv;}@Overridepublic void execute() {tv.on(); // 執行開機操作}@Overridepublic void undo() {tv.off(); // 撤銷開機操作}
}// 具體命令類:關機命令
public class OffCommand implements Command {private TV tv; // 電視機public OffCommand(TV tv) {this.tv = tv;}@Overridepublic void execute() {tv.off(); // 執行關機操作}@Overridepublic void undo() {tv.on(); // 撤銷關機操作}
}// 接收者:電視機
public class TV {public void on() {System.out.println("電視機開機了");}public void off() {System.out.println("電視機關機了");}public void changeChannel(int channel) {System.out.println("電視機切換到 " + channel + " 頻道");}
}// 調用者:遙控器
public class RemoteControl {private Command onCommand; // 開機命令private Command offCommand; // 關機命令public RemoteControl(Command onCommand, Command offCommand) {this.onCommand = onCommand;this.offCommand = offCommand;}public void pressOnButton() {onCommand.execute(); // 執行開機命令}public void pressOffButton() {offCommand.execute(); // 執行關機命令}public void pressUndoButton() {offCommand.undo(); // 撤銷上一個命令}
}// 客戶端
public class Client {public static void main(String[] args) {// 創建電視機TV tv = new TV();// 創建命令Command onCommand = new OnCommand(tv);Command offCommand = new OffCommand(tv);// 創建遙控器RemoteControl remoteControl = new RemoteControl(onCommand, offCommand);// 按下開機按鈕remoteControl.pressOnButton(); // 執行開機命令// 按下關機按鈕remoteControl.pressOffButton(); // 執行關機命令// 按下撤銷按鈕remoteControl.pressUndoButton(); // 撤銷關機命令}
}

代碼解釋

  • Command 接口定義了命令的接口,聲明了 executeundo 方法。
  • OnCommand 類和 OffCommand 類實現了 Command 接口,封裝了開機和關機的請求。
  • TV 類是接收者,負責執行開機和關機的操作。
  • RemoteControl 類是調用者,它持有 Command 接口的引用,負責在合適的時候調用命令。
  • 客戶端通過 RemoteControl 類發送命令,并調用 execute 方法執行命令。

輸出結果

電視機開機了
電視機關機了
電視機開機了

四、 命令模式的優缺點

優點:

  • 解耦發送者和接收者 🤝!
  • 支持命令的排隊、撤銷和重做 ??!
  • 支持宏命令 🔢!
  • 提高代碼的靈活性 🤸!

缺點:

  • 增加了類的數量 😫!
  • 代碼復雜度增加 🤯!

五、 命令模式的應用場景

  • GUI 應用程序: 菜單、按鈕、工具欄等等 🖱?!
  • 數據庫事務: 事務的提交、回滾等等 💱!
  • 游戲開發: 游戲角色的動作、技能等等 🎮!
  • 日志記錄: 記錄用戶的操作 📝!

六、 總結

  • 命令模式就像遙控器在手,天下我有! 🕹?
  • 核心概念包括命令接口、具體命令類、調用者和接收者! 🔑
  • 優點是解耦發送者和接收者、支持命令的排隊、撤銷和重做、支持宏命令、提高代碼的靈活性! 👍
  • 缺點是增加了類的數量、代碼復雜度增加! 👎
  • 適用于需要解耦請求發送者和接收者,或者需要支持命令的排隊、撤銷和重做的場景! 🎯

希望這篇文章能讓你徹底理解命令模式! 💯 祝你學習愉快! 😄
看完請看:(十 六)趣學設計模式 之 責任鏈模式!

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

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

相關文章

Matlab 大量接單

分享一個matlab接私活、兼職的平臺 1、技術方向滿足任一即可 2、技術要求 3、最后 技術方向滿足即可 MATLAB:熟練掌握MATLAB編程語言,能夠使用MATLAB進行數據處理、機器學習和深度學習等相關工作。 機器學習、深度學習、強化學習、仿真、復現、算法、…

【自學筆記】大數據基礎知識點總覽-持續更新

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 大數據基礎知識點總覽1. 大數據概述2. 大數據處理技術3. 數據倉庫與數據挖掘4. 大數據分析與可視化5. 大數據平臺與架構6. 大數據安全與隱私 總結 大數據基礎知識點…

17、什么是智能指針,C++有哪幾種智能指針【高頻】

智能指針其實不是指針,而是一個(模板)類,用來存儲指向某塊資源的指針,并自動釋放這塊資源,從而解決內存泄漏問題。主要有以下四種: auto_ptr 它的思想就是當當一個指針對象賦值給另一個指針對…

CAN總線通信協議學習2——數據鏈路層之幀格式

1 幀格式 幀格式可理解為定義了傳輸的數據(叫報文)應該“長什么樣”來傳輸,也為后續設定一些規則如錯誤檢查機制提供了思路。 首先,幀格式可分為以下5種類型: PS:CAN總線任意一個設備可當收也可當發&#…

MATLAB中asManyOfPattern函數用法

目錄 語法 說明 示例 匹配盡可能多的模式實例 指定要匹配的最小模式數 指定要匹配的最小和最大模式數 asManyOfPattern函數的功能是模式匹配次數盡可能多。 語法 newpat asManyOfPattern(pat) newpat asManyOfPattern(pat,minPattern) newpat asManyOfPattern(pat,m…

1×1卷積的作用與原理詳解

11卷積的作用與原理詳解 文章目錄 11卷積的作用與原理詳解引言1. 什么是11卷積?2. 11卷積的數學表達3. 11卷積的主要作用3.1 改變通道數(升維/降維)3.1.1 降維(Dimension Reduction)3.1.2 升維(Dimension I…

網絡配置的基本信息

目錄 一、網絡接口信息 1、關閉虛擬化服務 2、配置臨時IP 3、配置靜態IP 4、常見網絡命令 5、安裝Wireshark 一、網絡接口信息 輸入 ip address,會出現下面的內容 網卡名稱及其含義: 網卡名稱說明lo 表示本地回環地址。 ens32 有線網卡&#xff0c…

dify綁定飛書多維表格

dify 綁定飛書和綁定 notion 有差不多的過程,都需要套一層應用的殼子,而沒有直接可以訪問飛書文檔的 API。本文記錄如何在dify工具中使用新增多條記錄工具。 創建飛書應用 在飛書開放平臺創建一個應用,個人用戶創建企業自建應用。 自定義應…

深入解析Crawl4AI:為AI應用量身定制的高效開源爬蟲框架

引言 在當今數據驅動的時代,人工智能(AI)和大型語言模型(LLM)的發展對高質量數據的需求日益增長。如何高效地從互聯網上獲取、處理和提取有價值的數據,成為了研究人員和開發者面臨的關鍵挑戰。Crawl4AI作為…

nginx 動態計算攔截非法訪問ip

需求:在Nginx上實現一個動態攔截IP的方法,具體是當某個IP在1分鐘內訪問超過60次時,將其加入Redis并攔截,攔截時間默認1天。 技術選型:使用NginxLuaRedis的方法。這種方案通過Lua腳本在Nginx處理請求時檢查Redis中的黑…

【軟件測試】論壇系統功能測試報告

文章目錄 1.前言2.項目介紹3. 對項目進行測試3.1 設計測試用例3.2 執行測試用例 1.前言 這次測試是我學習階段的練習,由于缺少需求規格說明等文檔,需要我盡可能發散思維去設計更多的測試用例。但無論如何測試至關重要,以下是核心原因&#x…

MyBatis TypeHandler 詳解與實戰:FastJson 實現字符串轉 List

在 MyBatis 中&#xff0c;TypeHandler 是實現 Java 類型與數據庫類型雙向轉換 的核心組件。無論是處理基礎數據類型還是復雜的 JSON、枚舉或自定義對象&#xff0c;它都能通過靈活的擴展機制滿足開發需求。本文將通過一個 將數據庫 JSON 字符串轉換為 List<User> 的案例…

《HelloGitHub》第 107 期

興趣是最好的老師&#xff0c;HelloGitHub 讓你對編程感興趣&#xff01; 簡介 HelloGitHub 分享 GitHub 上有趣、入門級的開源項目。 github.com/521xueweihan/HelloGitHub 這里有實戰項目、入門教程、黑科技、開源書籍、大廠開源項目等&#xff0c;涵蓋多種編程語言 Python、…

【每日一題 | 2025】2.24 ~ 3.2

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;每日一題 文章目錄 1. 【2.24】P10424 [藍橋杯 2024 省 B] 好數2. 【2.25】P8665 [藍橋杯 2018 省 A] 航班時間3. 【2.26】P10905 [藍橋杯 2024 省 C] 回文字符串4. 【2.27】P10425 [藍橋杯 2024 省 B] R 格式5. 【2.28】P10426…

【03】STM32F407 HAL 庫框架設計學習

【03】STM32F407 HAL 庫框架設計學習 摘要 本文旨在為初學者提供一個關于STM32F407微控制器HAL&#xff08;Hardware Abstraction Layer&#xff09;庫框架設計的詳細學習教程。通過本文&#xff0c;讀者將從零開始&#xff0c;逐步掌握STM32F407的基本知識、HAL庫的配置步驟…

跟著官方文檔學習UE C++ TArray容器系列 迭代 和 排序

一.首先測試下&#xff0c;官方案例 迭代器的方法&#xff0c;有點不常見。有點像個指針&#xff0c;迭代完還自帶break. oid AWXTArrayActor::WXLoopArray() {FString JoinedStr1;FString JoinedStr2;TArray<FString> StrArr { "Hello","Baby",&q…

C++中的“結界”機制:作用域與變量可見性探秘

一、編程世界的“結界”概念 源自佛學的結界概念&#xff0c;在C中體現為作用域機制。程序中的每個函數都會形成獨立的作用域屏障&#xff0c;如同魔法結界般保護內部變量&#xff0c;使其與外界的同名變量互不干擾。這種機制保證了代碼模塊的獨立性和安全性&#xff0c;但當存…

3-6 WPS JS宏 工作表移動復制實例-1(工作表的拆分操作)學習筆記

************************************************************************************************************** 點擊進入 -我要自學網-國內領先的專業視頻教程學習網站 *******************************************************************************************…

Qt 對象樹詳解:從原理到運用

1. 什么是對象樹&#xff1f; 對象樹是一種基于父子關系的對象管理機制。在 Qt 中&#xff0c;所有繼承自 QObject 的類都可以參與到對象樹中。 當一個對象被設置為另一個對象的父對象時&#xff0c;子對象會被添加到父對象的內部列表中&#xff0c;形成一種樹狀結構。 Qt 提…

使用hutool將json集合對象轉化為對象

集合之間相互轉化 //List轉Json&#xff0c;maps是List類型的參數 String json JSONUtil.toJsonStr(maps); System.out.println("這是json字符串: "json);//Json轉List JSONArray objects JSONUtil.parseArray(json); List<Map> maps1 JSONUtil.toList(objec…