GPT帶我學-設計模式-命令模式

1 你知道設計模式的命令模式嗎

是的,我知道設計模式中的命令模式。命令模式是一種行為型設計模式,它將請求封裝成一個對象,從而允許使用不同的請求、隊列或日志來參數化其他對象。命令模式還支持撤銷操作,并且可以提供事務的實現。

在命令模式中,有四個主要的參與對象:命令接口(Command)、具體命令(ConcreteCommand)、命令發起者(Invoker)和命令執行者(Receiver)。命令接口充當了命令的抽象,并聲明了執行命令的方法。具體命令實現了命令接口,并具體實現了命令的執行邏輯。命令發起者持有一個命令對象,并可以調用命令對象的執行方法,從而觸發命令的執行。命令執行者實際執行命令的操作。

命令模式的優點包括:解耦命令發起者和命令執行者、簡化命令的撤銷和重做、支持事務等。它可以幫助我們將請求和執行解耦,并且可以提供更好的靈活性和可擴展性。

2 命令模式有幾種形式

命令模式主要有三種形式:簡單命令模式、宏命令模式和撤銷操作命令模式。

簡單命令模式(Simple Command Pattern):簡單命令模式是命令模式最基本的形式。它只包含一個命令接口和多個具體命令類。每個具體命令類都實現了命令接口,并實現了自己的執行邏輯。命令發起者只需要持有一個命令接口的引用,并通過調用命令接口的方法來觸發命令的執行。

宏命令模式(Macro Command Pattern):宏命令模式將多個命令封裝為一個宏命令,從而實現一次性執行多個命令。宏命令本身也是一個具體命令,它持有多個其他具體命令的引用,并在執行時依次調用這些命令的執行方法。宏命令模式可以將多個原子操作組合成一個更高級的操作。

撤銷操作命令模式(Undo Command Pattern):撤銷操作命令模式在簡單命令模式的基礎上加入了撤銷操作的支持。每個具體命令類都需要提供一個撤銷方法,在調用撤銷方法時可以回滾該命令的執行。撤銷操作命令模式可以用于實現撤銷和重做功能,使得用戶可以取消一系列操作的執行。

這些形式不是互斥的,可以根據具體的需求和場景選擇適合的命令模式形式。

3 請你用java寫一個簡單命令模式具體的例子

當然可以!下面是一個簡單的Java代碼示例,演示了簡單命令模式的實現:

// 定義命令接口
interface Command {void execute();
}// 具體命令類
class ConcreteCommand implements Command {private Receiver receiver;public ConcreteCommand(Receiver receiver) {this.receiver = receiver;}// 實現命令接口的執行方法public void execute() {receiver.action();}
}// 接收者類
class Receiver {public void action() {System.out.println("Receiver執行命令!");}
}// 命令發起者類
class Invoker {private Command command;public void setCommand(Command command) {this.command = command;}public void executeCommand() {command.execute();}
}// 客戶端代碼
public class Client {public static void main(String[] args) {// 創建接收者對象Receiver receiver = new Receiver();// 創建具體命令對象,并將接收者傳遞給它Command command = new ConcreteCommand(receiver);// 創建命令發起者對象,并設置命令對象Invoker invoker = new Invoker();invoker.setCommand(command);// 執行命令invoker.executeCommand();}
}

在上面的示例中,Command接口定義了命令的執行方法execute()。具體命令類ConcreteCommand實現了Command接口,并在execute()方法中調用了接收者對象的action()方法執行具體的命令操作。命令發起者類Invoker持有一個Command對象,并在executeCommand()方法中調用命令對象的execute()方法來觸發命令的執行。

運行以上代碼,輸出結果為:

Receiver執行命令!

這表明成功執行了命令模式,命令發起者通過調用命令對象的方法,將命令傳遞給接收者并執行了相關操作。

4 你這個例子還是太抽象了,請舉一個生活中具體的例子

當然!讓我們來看一個更具生活化的例子——簡單命令模式在餐廳點餐系統中的應用。

首先,我們定義一個命令接口Order,其中包含了一個執行命令的方法execute():

public interface Order {void execute();
}

然后,我們實現具體的命令類,比如CookOrder、ServeOrder和CancelOrder:

public class CookOrder implements Order {private Chef chef;public CookOrder(Chef chef) {this.chef = chef;}public void execute() {chef.cook();}
}public class ServeOrder implements Order {private Waiter waiter;public ServeOrder(Waiter waiter) {this.waiter = waiter;}public void execute() {waiter.serve();}
}public class CancelOrder implements Order {private Cashier cashier;public CancelOrder(Cashier cashier) {this.cashier = cashier;}public void execute() {cashier.cancel();}
}

在這個例子中,CookOrder是具體的烹飪命令,ServeOrder是具體的上菜命令,CancelOrder是具體的取消訂單命令。

接下來,我們定義幾個接收者類,比如Chef、Waiter和Cashier,它們都具有相應的操作:

public class Chef {public void cook() {System.out.println("廚師正在烹飪訂單...");}
}public class Waiter {public void serve() {System.out.println("服務員正在上菜...");}
}public class Cashier {public void cancel() {System.out.println("收銀員正在取消訂單...");}
}

最后,我們定義命令發起者類OrderInvoker,它持有一個Order對象,并在調用execute()方法時觸發命令的執行:

public class OrderInvoker {private Order order;public OrderInvoker(Order order) {this.order = order;}public void executeOrder() {order.execute();}
}

現在,我們可以使用上述類來模擬餐廳點餐的場景。例如,在點餐系統中,當一個顧客確定要點餐后,服務員會將顧客的訂單交給廚師,并通知收銀員進行結算

public class RestaurantClient {public static void main(String[] args) {Chef chef = new Chef();Waiter waiter = new Waiter();Cashier cashier = new Cashier();Order cookOrder = new CookOrder(chef);Order serveOrder = new ServeOrder(waiter);Order cancelOrder = new CancelOrder(cashier);OrderInvoker invoker = new OrderInvoker(cookOrder);invoker.executeOrder();invoker = new OrderInvoker(serveOrder);invoker.executeOrder();invoker = new OrderInvoker(cancelOrder);invoker.executeOrder();}
}

當我們運行以上代碼時,控制臺將會輸出:

廚師正在烹飪訂單...
服務員正在上菜...
收銀員正在取消訂單...

這個例子中,顧客點餐后,服務員將不同的訂單給相應的接收者(廚師、服務員和收銀員),通過簡單命令模式實現了對不同操作的封裝和執行。

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

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

相關文章

探討uniapp的網絡通信問題

uni-app 中有很多原生的 API,其中我們經常會用到的肯定有:uni.request(OBJECT) method 有效值 注意:method有效值必須大寫,每個平臺支持的method有效值不同,詳細見下表。 success 返回參數說明 data 數據說明 最終…

氣液固三相線識別—Langmuir部分復現

關注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material

c#和pdf.js實現分片預覽pdf

源碼如下&#xff1a; /// <summary>/// 文件處理/// </summary>[RoutePrefix("api/fs")]public class FileStoreController : ApiController{/// <summary>/// 文件預覽/// </summary>/// <param name"filepath">文件路徑…

【數據結構OJ題】移除鏈表元素

原題鏈接&#xff1a;https://leetcode.cn/problems/remove-linked-list-elements/description/ 1. 題目描述 2. 思路分析 我們可以定義一個結構體指針變量cur&#xff0c;讓cur一開始指向頭結點&#xff0c;同時定義一個結構體指針prev&#xff0c;令prev初始化為空指針NULL…

基于長短期神經網絡LSTM的碳排量預測,基于LSTM的碳排放量預測

目錄 背影 摘要 LSTM的基本定義 LSTM實現的步驟 基于長短期神經網絡LSTM的碳排放量預測 完整代碼: 基于長短期神經網絡LSTM的碳排放量預測,基于LSTM的碳排放量預測資源-CSDN文庫 https://download.csdn.net/download/abc991835105/88184632 效果圖 結果分析 展望 參考論文 背…

DIP:《Deep Image Prior》經典文獻閱讀總結與實現

文章目錄 Deep Image Prior1. 方法原理1.1 研究動機1.2 方法 2. 實驗驗證2.1 去噪2.2 超分辨率2.3 圖像修復2.4 消融實驗 3. 總結 Deep Image Prior 1. 方法原理 1.1 研究動機 動機 深度神經網絡在圖像復原和生成領域有非常好的表現一般歸功于神經網絡學習到了圖像的先驗信息…

Python解決-力扣002-兩數相加

兩數相加&#xff1a;鏈表表示的逆序整數求和 在這篇技術博客中&#xff0c;我們將討論一個力扣&#xff08;LeetCode&#xff09;上的編程題目&#xff1a;兩數相加。這個問題要求我們處理兩個非空鏈表&#xff0c;它們表示兩個非負整數。每個鏈表中的數字都是逆序存儲的&…

Redis——String類型詳解

概述 Redis中的字符串直接按照二進制的數據存儲&#xff0c;不會有任何的編碼轉換&#xff0c;因此存放什么樣&#xff0c;取出來的時候就什么樣。而MySQL默認的字符集是拉丁文&#xff0c;如果插入中文就會失敗 Redis中的字符串類型不僅可以存放文本數據&#xff0c;還可以存…

通過Python爬蟲提升網站搜索排名

目錄 怎么使用Python爬蟲提升排名 1. 抓取競爭對手數據&#xff1a; 2. 關鍵詞研究&#xff1a; 3. 網頁內容優化&#xff1a; 4. 內部鏈接建設&#xff1a; 5. 外部鏈接建設&#xff1a; 6. 監測和調整&#xff1a; 需要注意哪些方面 1. 合法性和道德性&#xff1a; …

VB+SQL期刊信息管理系統設計與實現

摘 要 本次畢業設計課題為“期刊信息管理系統”,該系統在正常運營中總是面對大量的讀者信息、期刊信息以及兩者相互作用產生的借刊信息,還刊信息。因此需要對讀者資源、期刊資源、借刊信息、還刊信息進行管理,及時了解各個環節中信息的變更,有利于提高管理效率。 此次畢…

阿里三年功能測試的一些感悟

一、前言 功能測試是測試工程師的基礎功&#xff0c;很多人功能測試還做不好&#xff0c;就想去做性能測試、自動化測試。很多人對功能測試的理解就是點點點&#xff0c;如何自己不用心去悟&#xff0c;去研究&#xff0c;那么你的職業生涯也就停留在點點點上了。在這里&#…

Flv格式視頻怎么轉MP4?視頻格式轉換方法分享

FLV格式的視頻是一種早期的視頻格式&#xff0c;不支持更高的分辨率和比特率&#xff0c;這意味著視頻的清晰度和質量受限制&#xff0c;無法很好地保留細節和質量&#xff0c;這種格式的視頻已經逐漸被更高質量的視頻格式所替代&#xff0c;例如MP4格式&#xff0c;不僅具有很…

Java基礎(七)排序算法

排序 1. 冒泡排序 >> 冒泡排序的思想 冒泡排序是一種簡單的排序算法&#xff0c;其基本思想是通過多次遍歷待排序序列&#xff0c;依次比較相鄰的元素并交換位置&#xff0c;使得每次遍歷后最大&#xff08;或最小&#xff09;的元素冒泡到序列的末尾。具體步驟如下&a…

SpringBoot+Mybatis-Plus實現增刪改查超詳細步驟

目錄 一、介紹 二、前期準備工作 &#xff08;一&#xff09; 創建springboot項目和創建數據庫 三、項目配置 &#xff08;一&#xff09;pom.xl導入相關依賴 1.導入依賴 &#xff08;二&#xff09;yml文件中配置連接數據庫 2.配置yml文件 四、代碼的編寫 數據庫展…

推斷統計(配對樣本t檢驗)

根據題目我們也可以看出配對樣本 t 檢驗是用來檢驗兩配對正態總體的均值是否存在顯著差異的一種假設檢驗方法&#xff0c;雖然是兩組數據但是其來自同一部分個體在兩個時間段內的測試數據&#xff0c;是同一部份個體&#xff01; 進行配對樣本 t 檢驗之后也是分別做出原假設和備…

【基礎學習筆記 enum】TypeScript 中的 enum 枚舉類型介紹

因為之前網上查好多博客都是只說最基礎的&#xff0c;所以這里記錄一下&#xff0c;最基礎的放在最后面。 這里重點要記錄的是枚舉成員的值可以是字符串&#xff08;字符串枚舉&#xff0c;因為網上大部分只介紹常數枚舉&#xff09;&#xff0c;需要注意的一點是&#xff0c;…

ADC實驗

查看VR1鏈接的絲印&#xff1a;XadcAIN3 設置相關寄存器 使用的是通道3&#xff0c;要設置相應的通道寄存器 #include "exynos_4412.h"int main() {unsigned int AdcValue 0;/*將ADC的精度設置成 12bit*/ADCCON ADCCON | (1 << 16);/*使能ADC的分頻器*…

SAP ABAP 直接把內表轉換成PDF格式(smartform的打印函數輸出OTF格式數據)

直接上代碼&#xff1a; REPORT zcycle055.DATA: lt_tab TYPE TABLE OF zpps001. DATA: ls_tab TYPE zpps001.ls_tab-werks 1001. ls_tab-gamng 150.00. ls_tab-gstrp 20201202. ls_tab-aufnr 000010000246. ls_tab-auart 標準生產. ls_tab-gltrp 20201205. ls_tab-matn…

MyBatis面試題

MyBatis面試題&#xff1a; 1、MyBatis是什么&#xff1f; Mybatis是一個半ORM&#xff08;對象關系映射&#xff09;框架&#xff0c;它內部封裝了JDBC&#xff0c;加載驅動、創建連接、創建statement等繁雜的過程&#xff0c;開發者開發時只需要關注如何編寫SQL語句&#xf…