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.mzph.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 …