c#實現命令模式

下面是一個使用C#實現命令模式的示例代碼:

using System;
using System.Collections.Generic;// 命令接口
public interface ICommand
{void Execute();void Undo();
}// 具體命令:打開文件
public class OpenFileCommand : ICommand
{private FileManager fileManager;public OpenFileCommand(FileManager fileManager){this.fileManager = fileManager;}public void Execute(){fileManager.Open();}public void Undo(){fileManager.Close();}
}// 具體命令:保存文件
public class SaveFileCommand : ICommand
{private FileManager fileManager;public SaveFileCommand(FileManager fileManager){this.fileManager = fileManager;}public void Execute(){fileManager.Save();}public void Undo(){fileManager.UndoSave();}
}// 接收者:文件管理器
public class FileManager
{public void Open(){Console.WriteLine("打開文件");}public void Close(){Console.WriteLine("關閉文件");}public void Save(){Console.WriteLine("保存文件");}public void UndoSave(){Console.WriteLine("撤銷保存文件");}
}// 調用者:命令執行器
public class CommandExecutor
{private List<ICommand> commands = new List<ICommand>();public void AddCommand(ICommand command){commands.Add(command);}public void ExecuteCommands(){foreach (var command in commands){command.Execute();}commands.Clear();}public void UndoCommands(){for (int i = commands.Count - 1; i >= 0; i--){commands[i].Undo();}commands.Clear();}
}// 示例代碼
class Program
{static void Main(string[] args){FileManager fileManager = new FileManager();OpenFileCommand openCommand = new OpenFileCommand(fileManager);SaveFileCommand saveCommand = new SaveFileCommand(fileManager);CommandExecutor executor = new CommandExecutor();executor.AddCommand(openCommand);executor.AddCommand(saveCommand);executor.ExecuteCommands();executor.UndoCommands();Console.ReadKey();}
}

在上述示例中,我們首先定義了一個命令接口ICommand,它包含了Execute和Undo方法。然后我們創建了兩個具體的命令類OpenFileCommand和SaveFileCommand,分別表示打開文件和保存文件的命令。

接下來,我們創建了一個接收者FileManager,它是實際執行命令的對象。FileManager中包含了一些具體的操作方法,比如打開文件、關閉文件、保存文件等。

最后,我們創建了一個調用者CommandExecutor,它可以添加和執行命令。調用者將命令添加到命令列表中,并在需要時一起執行或撤銷。

在示例代碼中,我們創建了一個CommandExecutor對象,添加了打開文件和保存文件的命令。然后我們依次執行這些命令,并在最后撤銷執行的命令。運行代碼后,你將看到打開文件、關閉文件、保存文件和撤銷保存文件的輸出。

通過使用命令模式,我們可以將操作封裝成命令對象,并在需要時進行執行或撤銷。這種方式可以實現請求和執行解耦,同時也方便擴展和管理多個命令。

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

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

相關文章

【MySQL】MySQL不走索引的情況分析

未建立索引 當數據表沒有設計相關索引時&#xff0c;查詢會掃描全表。 create table test_temp (test_id int auto_incrementprimary key,field_1 varchar(20) null,field_2 varchar(20) null,field_3 bigint null,create_date date null );expl…

ffmpeg命令行是如何打開vf_scale濾鏡的

前言 在ffmpeg命令行中&#xff0c;ffmpeg -i test -pix_fmt rgb24 test.rgb&#xff0c;會自動打開ff_vf_scale濾鏡&#xff0c;本章主要追蹤這個流程。 通過gdb可以發現其基本調用棧如下&#xff1a; 可以看到&#xff0c;query_formats&#xff08;&#xff09;中創建的v…

Unity框架學習--2

接上文 IOC 容器是一個很方便的模塊管理工具。 除了可以用來注冊和獲取模塊&#xff0c;IOC 容器一般還會有一個隱藏的功能&#xff0c;即&#xff1a; 注冊接口模塊 抽象-實現 這種形式注冊和獲取對象的方式是符合依賴倒置原則的。 依賴倒置原則&#xff08;Dependence I…

maven install

maven install maven 的 install 命令&#xff0c;當我們的一個 maven 模塊想要依賴其他目錄下的模塊時&#xff0c;直接添加會找不到對應的模塊&#xff0c;只需要找到需要引入的模塊&#xff0c;執行 install 命令&#xff0c;就會將該模塊放入本地倉庫&#xff0c;就可以進…

Linux tar包安裝 Prometheus 和 Grafana(知識點:systemd Unit/重定向)

0. 介紹 用tar包的方式安裝 Prometheus 和 Grafana Prometheus:開源的監控方案Grafana:將Prometheus的數據可視化平臺 Prometheus已經有了查詢功能為什么還需要grafana呢?Prometheus基于promQL這一SQL方言,有一定門檻!Grafana基于瀏覽器的操作與可視化圖表大大降低了理解難…

Vue3 setup tsx 子組件向父組件傳值 emit

需求&#xff1a;Vue3 setup 父組件向子組件傳值&#xff0c;子組件接收父組件傳入的值&#xff1b;子組件向父組件傳值&#xff0c;父組件接收的子組件傳遞的值。 父組件&#xff1a;parent.tsx&#xff1a; import { defineComponent, ref, reactive } from vue; import To…

【Android】okhttp爆java.lang.IllegalStateException: closed的解決方法

解決 java.lang.IllegalStateException: closed異常通常是由于OkHttp中的Response對象在調用response.body().string()后被關閉而導致的。 在代碼中&#xff0c;在onResponse()方法中如果兩次調用了response.body().string()&#xff0c;每次調用都會消耗掉響應體并關閉Respo…

如何優化PHP Smarty模板的性能?

Smarty模板是一種非常強大的模板引擎&#xff0c;但是如果不正確地使用&#xff0c;可能會導致你的網站慢得像一只樹懶&#xff01; 那么&#xff0c;如何優化Smarty模板的性能呢&#xff1f; 減少Smarty對象的創建 你可能會在代碼中多次創建Smarty對象。但是&#xff0c;每次…

Server - 文字轉語音 (Text to Speech) 的在線服務 TTSMaker

歡迎關注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132287193 TTSMaker 是一款免費的文本轉語音工具&#xff0c;提供語音合成服務&#xff0c;支持多種語言&#xff0c;包括英語、法語、德語、西班…

什么是冒煙測試?

冒煙測試&#xff0c;剛進公司就接觸到了。只是剛開始一直沒有體會到冒煙的含義和精髓&#xff0c;一直以為是冒煙測試就是把待測產品的主要功能測試一下就行了。后面回想一下&#xff0c;不是那么回事的。 冒煙測試源自硬件行業&#xff0c;對一個硬件或者硬件組件改動后&…

Exams/ece241 2013 q4

蓄水池問題 S3 S2 S1 例如&#xff1a;000 代表 無水 &#xff0c;需要使FR3, FR2, FR1 都打開&#xff08;111&#xff09; S3 S2 S1 FR3 FR2 FR1 000 111 001 011 011 001 111 000 fr代表水變深為…

快手商品詳情數據API 抓取快手商品價格、銷量、庫存、sku信息

快手商品詳情數據API是用來獲取快手商品詳情頁數據的接口&#xff0c;請求參數為商品ID&#xff0c;這是每個商品唯一性的標識。返回參數有商品標題、商品標題、商品簡介、價格、掌柜昵稱、庫存、寶貝鏈接、寶貝圖片、商品SKU等。 接口名稱&#xff1a;item_get 公共參數 名…

【PostgreSQL的CLOG解析】

同樣還是這張圖&#xff0c;之前發過shared_buffer和os cache、wal buffer和work mem的文章&#xff0c;今天的主題是圖中的clog&#xff0c;即 commit log&#xff0c;PostgreSQL10之前放在數據庫目錄的pg_clog下面。PostgreSQL10之后修更名為xact,數據目錄變更為pg_xact下面&…

WPF 本地化的最佳做法

WPF 本地化的最佳做法 資源文件英文資源文件 en-US.xaml中文資源文件 zh-CN.xaml 資源使用App.xaml主界面布局cs代碼 App.config輔助類語言切換操作類資源 binding 解析類 實現效果 應用程序本地化有很多種方式&#xff0c;選擇合適的才是最好的。這里只討論一種方式&#xff0…

pytorch單機多卡后臺運行

nohup sh ./train_chat.sh > train_chat20230814.log 2>1&參考資料 Pytorch單機多卡后臺運行的解決辦法

kafka-2.12使用記錄

kafka-2.12使用記錄 安裝kafka 2.12版本 下載安裝包 根據你的系統下載rpm /deb /zip包等等, 這里我使用的是rpm包 安裝命令 rpm -ivh kafka-2.12-1.nfs.x86_64.rpm啟動內置Zookeeper 以下命令要寫在同一行上 /opt/kafka-2.12/bin/zookeeper-server-start.sh /opt/kafka-2…

實驗二十八、三角波發生電路參數的確認

一、題目 利用 Multisim 確定圖1所示電路中各元件的參數&#xff0c;使輸出電壓的頻率為 500 Hz 500\,\textrm{Hz} 500Hz、幅值為 6 V 6\,\textrm{V} 6V 的三角波。 圖 1 三角波發生電路 圖1\,\,三角波發生電路 圖1三角波發生電路 2、仿真電路 A 1 \textrm A_1 A1? 采用…

深入解析 MyBatis 中的 lt;foreachgt; 標簽:優雅處理批量操作與動態 SQL

在當今的Java應用程序開發中&#xff0c;數據庫操作是一個不可或缺的部分。MyBatis作為一款頗受歡迎的持久層框架&#xff0c;為我們提供了一種優雅而高效的方式來管理數據庫操作。在MyBatis的眾多特性中&#xff0c;<foreach>標簽無疑是一個強大的工具&#xff0c;它使得…

sift-1M數據集的讀取及ES插入數據

sift是檢查ann近鄰召回率的標準數據集,ann可以選擇faiss,milvus等庫或者方法;sift數據分為query和base,以及label(groundtruth)數據。本文采用sift-1M進行解讀,且看如下: 1、sift-1m數據集 官方鏈接地址:Evaluation of Approximate nearest neighbors: large datase…

Java:簡單算法:冒泡排序、選擇排序、二分查找

冒泡排序 // 1、準備一個數組 int[] arr {5&#xff0c;2&#xff0c;3&#xff0c;1};//2、定義一個循環控制排幾輪 for (int i 0; i < arr.length - 1; i) { // i 0 1 2 【5&#xff0c;2&#xff0c;3&#xff0c;1】 次數 // i 0 第一輪 0 1 2 …