【AHK V2】設計模式之命令模式

目錄

    • 情景劇場
    • 什么是命令模式
    • 優缺點
      • 優點
      • 缺點
    • 使用命令模式的步驟
    • 命令模式代碼示例
    • 合理使用AI工具自動生成代碼

情景劇場

我們來設想一個場景:

你進入一家餐館,餐館只有老板一個人(老板即廚師)。

“老板,一份小炒肉,不要辣。”

老板收到了你的訂單請求,去后廚做菜了。這時又進來幾位顧客:

“老板,來兩份清炒時蔬,不要辣。”

“老板,我要一份清炒時蔬,多放辣。”

“老板,一份小炒肉,多放辣,打包。”

“老板,我的兩份清炒時蔬改成一份,打包。”

顧客
+點菜()
廚師
+小炒肉()
+清炒時蔬()

當顧客變多,請求也變多,而每個顧客的請求也非常不一樣。老板就很容易分不清誰的需求是什么,做錯菜、上錯菜都是會發生的錯誤。顧客對老板直接提出請求,請求多了很容易導致混亂。這里顧客就是請求的發送者,老板就是請求的接收者,請求者和接收者的“緊耦合”雖然邏輯簡單,但是很容易僵化。
當給餐館加上服務員和訂單,就會不一樣:

顧客走進餐館開始點單,服務員接過顧客的訂單,并將其寫在一張紙上。服務員去廚房,把訂單貼在墻上,訂單按排列順序到達廚師手中,這樣廚師做菜就不會混亂,也不會遺忘。廚師將餐點與訂單一起轉交服務員,服務員檢查訂單并將所有東西帶到顧客的餐桌上。在此期間,顧客可以撤銷訂單或增刪訂單需求。

顧客
+點菜()
-取消點菜()
Order
+點菜()
-取消點菜()
小炒肉
+點菜()
-取消點菜()
清炒時蔬
+點菜()
-取消點菜()
服務員
orders : List
takeOrder()
placeOrder()
廚師
炒肉()
炒時蔬()

顧客不需要知道是誰來完成烹飪,廚師不需要知道是誰的訂單,紙質訂單用作命令,一直排在隊列中。這也就實現了請求者和接收者的解耦。

什么是命令模式

命令模式(Command Pattern)是一種行為設計模式,它把請求或操作封裝成一個包含有關請求所有信息的獨立對象,此轉換允許將請求作為方法參數傳遞,延遲或排隊請求的執行,并支持可撤消的操作,從而實現將請求者和接收者解耦。

優缺點

命令模式是一種靈活且功能強大的設計模式,主要優點是它允許在不修改現有客戶端代碼的情況下添加新的命令。此外,通過使用命令模式,可以將操作記錄到日志中、撤銷操作或者將操作進行隊列化等,同時他也有一些缺點。

優點

  1. 解耦性:命令模式通過將請求發送者與接收者解耦,使得請求發送者不需要知道接收者的具體實現細節,從而增強了系統的靈活性和可維護性。

  2. 可擴展性:通過添加新的具體命令類,可以很容易地擴展系統的功能,而不需要修改已有的代碼。

  3. 支持撤銷和重做:命令模式可以記錄請求的歷史操作,從而支持對操作的撤銷和重做,提供了更好的用戶體驗。

  4. 支持日志和隊列:可以將命令對象保存在日志中,實現系統的日志記錄功能。此外,命令對象還可以組織成隊列,實現命令的批處理和延遲執行。

  5. 命令模式符合“開-閉”原則。因為將具體命令封裝成了一個一個獨立的對象,所有當需要修改現有功能時,可以通過添加新代碼來實現,而不是修改已有的代碼。這樣可以提高代碼的可維護性和可擴展性,減少出錯率和代碼復雜度。具體點說,在增加新的具體命令或增加命令的接收者時,不需要修改原有調用者的代碼;而在增加新的調用者時,不需要修改原有的具體命令和接收者的代碼。

  6. 命令模式支持宏命令。

即將多個命令組合成一個命令。這樣可以將多個操作封裝成一個操作,減少了代碼的冗余和重復,提高代碼的復用率。

缺點

  1. 類的數量增加:引入命令模式會增加系統中的類的數量,特別是在有大量具體命令類的情況下,可能會導致類的數量激增,增加了系統的復雜性。
  2. 命令的單一性:每個具體命令類通常只封裝了一個特定的操作,這可能會導致系統中存在大量的具體命令類,增加了系統的管理和維護成本。
  3. 對象間的調用鏈可能過長:在命令模式中,請求發送者、命令對象、接收者之間可能存在多層的調用鏈,特別是在復雜的系統中,可能會導致調用鏈過長,影響系統的性能。
    雖然命令模式有一些缺點,但在很多場景下仍然是一種非常有用的設計模式,特別是在需要支持撤銷、重做、日志記錄和隊列等功能的情況下。

使用命令模式的步驟

使用命令模式可以通過以下步驟進行:

  1. 確定參與者:首先,確定在系統中誰是命令的發起者(Invoker)、命令的接收者(Receiver)、以及具體的命令對象(Command)。
  2. 定義命令接口:創建一個命令接口,其中包含一個執行操作的方法(如execute())。這個接口可以是抽象類或者接口,具體取決于設計的需求。
  3. 實現具體命令類:針對每個具體的操作,創建一個具體的命令類,實現命令接口,并在其中封裝具體的操作實現。
  4. 創建接收者類:定義接收者類,實現命令所需的具體操作。 創建調用者類:創建一個調用者類,負責向具體的命令對象發送請求。
  5. 創建客戶端代碼:在客戶端代碼中創建具體的命令對象,并將其關聯到調用者對象上。

命令模式代碼示例

; 定義命令接口
class ICommand {Execute() {; 需要被覆蓋的方法(抽象方法)}
}; 定義具體命令A
class CommandA extends ICommand {Execute() {MsgBox("Command A Executed")}
}; 定義具體命令B
class CommandB extends ICommand {Execute() {MsgBox("Command B Executed")}
}; 定義調用者,負責執行命令
class Invoker {__New(command) {this.command := command}ExecuteCommand() {this.command.Execute()}
}; 客戶端代碼
main() {; 創建命令實例_commandA := CommandA()_commandB := CommandB(); 創建調用者并關聯命令_invokerA := Invoker(_commandA)_invokerB := Invoker(_commandB); 執行命令_invokerA.ExecuteCommand()_invokerB.ExecuteCommand()
}; 運行主程序
main()

合理使用AI工具自動生成代碼

上面的代碼是用Comate生成的
在這里插入圖片描述
代碼就是上面那部分,我就不截圖了,稍微改改就可以運行。也可以把報錯信息提示給它,它會給出修改代碼示例。

還可以讓它輸出UML類圖:
在這里插入圖片描述
這個mermaid代碼直接在CSDN的波紋MD編輯模式可以直接用哦。

感興趣可以在VSCODE中安裝這個AI編碼助手——Comate,感覺能在小眾語言AHK上表現這么好還是很令人驚訝的。
https://comate.baidu.com/zh/shopping?inviteCode=kqqi3lsj

Alt

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

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

相關文章

Vue插槽solt如何傳遞具名插槽的數據給子組件?

在Vue中,你可以通過作用域插槽(scoped slots)來傳遞數據給子組件。這同樣適用于具名插槽。首先,你需要在子組件中定義一個具名插槽,并通過v-slot指令傳遞數據。例如: 子組件(ChildComponent.vu…

自用RedisConfig的配置,更改key為string和value json的序列化,避免set亂的key

自用RedisConfig的配置,更改key為string和value json的序列化,避免set亂的key,使用StringRedisTemplate也可以解決,保證了redis set的值是正確的 Configuration public class RedisConfig {//更改key為string和value json的序列化…

吃透1850道真題和解析備考AMC8和AMC(1020240524持續發布)

多做真題,吃透真題和背后的知識點是備考AMC8、AMC10有效的方法之一,通過做真題,可以幫助孩子找到真實競賽的感覺,而且更加貼近比賽的內容,可以通過真題查漏補缺,更有針對性的補齊知識的短板。 今天我們繼續…

在新cloud上啟動備份數據庫

情況介紹:在云上劃拉一塊地方建立本地數據庫測試環境,通過數據庫備份包恢復數據并啟動。 1.在云上或者你自己的server上安裝Percona Server for MySQL,步驟如下 Use APT repositories - Percona Server for MySQL How to Install or Upgra…

java實現List對象轉geojson文本返回前端

1.業務需求 查詢帶有經緯度數據的list列表,將其轉為geojson格式給前端。 2.GeoJson格式說明 GeoJSON是一種對各種地理數據結構進行編碼的格式,基于Javascript對象表示法(JavaScript Object Notation, 簡稱JSON)的地理空間信息數據交換格式。GeoJSON對…

計算機系統的層次結構

操作系統的定義 操作系統(Operating System, OS)是指控制和管理整個計算機系統的硬件和軟件資源,并合理地組織調度計算機的工作和資源的分配;以提供給用戶和其他軟件方便的接口和環境;它是計算機系統中最基…

GBase 8s 如何查看回滾的事務 和對應的SQL

描述: 如何查看當前數據庫中是否有事務在回滾, 如果有, 具體是哪條 SQL 在回滾? 解決辦法: 方法1: 通過 onstat -u|grep RP; 可以獲取相關的 sessionid。 通過 onstat -g ses sid 獲取 SQL&a…

【多模態融合】Cross Modal Transformer: Towards Fast and Robust 3D Object Detection

論文鏈接:Cross Modal Transformer: Towards Fast and Robust 3D Object Detection 代碼鏈接:https://github.com/junjie18/CMT 作者:Junjie Yan, Yingfei Liu, Jianjian Sun, Fan Jia, Shuailin Li, Tiancai Wang, Xiangyu Zhang 發表單位…

字符串的周期:每一期都有那么幾位

【題目描述】 如果一個字符串可以由某個長度為k的字符串重復多次得到,則稱該串以k為周期。例 如,abcabcabcabc以3為周期(注意,它也以6和12為周期)。 輸入一個長度不超過80的字符串(不含空格),輸出其最小周期。 輸入第一行表示有T組數據,后續是T行字符串。輸出的每組…

性能測試工具

性能測試工具 1.Jmeter 環境搭建1.安裝JDK2.安裝Jmeter1.下載2.安裝3.環境配置 3.Jmeter 文件目錄介紹1.bin目錄2.docs 目錄3.printable_docs目錄4.lib目錄 4.修改默認配置1.漢化配置2.修改主題 5.元件的基本介紹6.元件的作用域作用域的原則 7.元件的執行順序 1.Jmeter 環境搭建…

Linux基礎-目錄命令

目錄文件命令 一、概述二、文件目錄1. 目錄信息1. pwd:顯示當前目錄2. cd :切換目錄3. ls:顯示目錄中的文件信息 2. 操作目錄1. mkdir : 創建目錄2. rm : 刪除目錄3. mv : 移動、重命名目錄4. cp :拷貝命令 一、概述 這里記錄一下…

【Pytorch】16.使用ImageFolder加載自定義MNIST數據集訓練手寫數字識別網絡(包含數據集下載)

數據集下載 MINST_PNG_Training在github的項目目錄中的datasets中有MNIST的png格式數據集的壓縮包 用于訓練的神經網絡模型 自定義數據集訓練 在前文【Pytorch】13.搭建完整的CIFAR10模型我們已經知道了基本搭建神經網絡的框架了,但是其中的數據集使用的torchvision…

Flutter 中的 WidgetInspector 小部件:全面指南

Flutter 中的 WidgetInspector 小部件:全面指南 Flutter 的 WidgetInspector 是一個強大的工具,它允許開發者在運行時檢查和操作他們的 widget 樹。這在調試復雜的布局和 widget 結構時尤其有用。本文將為您提供一個全面的指南,幫助您了解如…

Excel 按順序去重再編號

Excel的A有重復數據: A1Cow2Chicken3Horse4Butterfly5Cow 現在要去除重復,用自然數按順序進行編號,結果寫在相鄰列: AB1Cow12Chicken23Horse34Butterfly45Cow1 使用 SPL XLL,輸入公式并向下拖: spl(&q…

RISC-V壓縮指令擴展測試

概述 RISC-V定義了壓縮指令擴展(compressed instruction-set extension ),命名為“C”擴展。壓縮指令使用16位寬指令替換32位寬指令,從而減少代碼量。這個C擴展可運用在RV32、RV64和RV128指令集上,通常使用“RVC”來表…

Double 4 VR情景實訓教學系統在商務洽談課堂上的應用

隨著科技的不斷發展,VR(虛擬現實)技術已經逐漸滲透到各個領域。在商務洽談課堂上,Double 4 VR情景實訓教學系統不僅可以為學生提供身臨其境的模擬環境,還可以通過互動和交互式學習方式,增強學生的學習體驗和…

貝銳向日葵打造農機設備遠程運維支持方案

當物聯網“萬物互聯”的概念向第一產業賦能,農機設備的智能化程度也越來越高。 所謂農業物聯網,即在應用層將大量的傳感器節點構成監控網絡,通過各種傳感器采集信息,以幫助農民及時發現問題,并準確地判定發生問題的位…

QT 使用QZipReader 進行文件解壓縮

目錄 1、QZipReader 概述 2、解壓示例 3、說明 1、QZipReader 概述 QZipReader 是一個方便的工具,用于在 Qt 應用程序中解壓 ZIP 壓縮包。它提供了讀取 ZIP 文件的接口,并能提取其中的內容。以下是如何使用 QZipReader 解壓 ZIP 文件的示例代碼&#…

List、IList、ArrayList 和 Dictionary

List 類型: 泛型類命名空間: System.Collections.Generic作用: List<T> 表示一個強類型的對象列表&#xff0c;可以通過索引訪問。提供了搜索、排序和操作列表的方法。特點: 類型安全&#xff0c;性能較好&#xff0c;適用于需要強類型和高效操作的場景。例子: List<…

每日一練 - BGP Keepalive 報文詳解

01 真題題目 關于 BGP 的 Keepalive 報文消息的描述,錯誤的是&#xff1a; A.Keepalive 周期性的在兩個 BGP 鄰居之間發送 B.缺省情況下,Keepalive 的時間間隔是 180s C.Keepalive 報文主要用于對等路由器間的運行狀態和鏈路的可用性確認 D.Keepalive 報文的組成只包含一個…