当前位置: 首页 > news >正文

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对象,添加了打开文件和保存文件的命令。然后我们依次执行这些命令,并在最后撤销执行的命令。运行代码后,你将看到打开文件、关闭文件、保存文件和撤销保存文件的输出。

通过使用命令模式,我们可以将操作封装成命令对象,并在需要时进行执行或撤销。这种方式可以实现请求和执行解耦,同时也方便扩展和管理多个命令。

相关文章:

c#实现命令模式

下面是一个使用C#实现命令模式的示例代码&#xff1a; using System; using System.Collections.Generic;// 命令接口 public interface ICommand {void Execute();void Undo(); }// 具体命令&#xff1a;打开文件 public class OpenFileCommand : ICommand {private FileMana…...

Kubernetes的默认调度和自定义调度详解

默认调度和自定义调度详解 默认调度 默认调度是 Kubernetes 中的内置机制&#xff0c;它使用调度器组件来管理分配容器的节点。调度器依据以下原则选择合适的节点&#xff1a; 资源需求 &#xff1a;调度器会为每个 Pod 根据其 CPU 和内存需求选择一个具有足够资源的节点。亲…...

使用Spring-Security后,浏览器不能缓存的问题

Spring-Security在默认情况下是不允许客户端进行缓存的&#xff0c;在使用时可以通过禁用Spring-Security中的cacheControl配置项允许缓存。 protected void configure(HttpSecurity http) throws Exception {// 允许缓存配置http.headers().cacheControl().disable(); }...

中睿天下入选河南省网信系统2023年度网络安全技术支撑单位

近日&#xff0c;河南省委网信办发布了“河南省网信系统2023年度网络安全技术支撑单位名单”&#xff0c;中睿天下凭借出色的网络安全技术能力和优势成功入选。 本次遴选由河南省委网信办会同国家计算机网络与信息安全管理中心河南分中心&#xff08;以下简称安全中心河南分中心…...

代码随想录day44 45 46

这部分的题目主要介绍了完全背包的内容&#xff1b; 主要考虑了两种情况&#xff0c;求组合数还是排列数 先遍历背包&#xff0c;再遍历物品&#xff0c;得到的就是组合数&#xff0c;也就是有顺序 for (int j 0; j < amount; j) { // 遍历背包容量for (int i 0; i <…...

一探Linux下的七大进程状态

文章目录 一、前言二、操作系统学科下的进程状态1、运行状态2、阻塞状态3、挂起状态 三、Linux下的7种进程状态1、运行状态R2、浅度睡眠状态S3、深度睡眠状态D一场有趣的官司 4、停止状态T5、进程跟踪状态t6、死亡状态X7、僵死状态Z —— 两个特殊进程① 僵尸进程② 孤儿进程 四…...

香港站群服务器为什么适合seo优化?

​  香港站群为什么适合seo优化?本文主要从以下四点出发进行原因阐述。 1.香港站群服务器的优势 2.香港站群服务器与国内服务器的对比 3.多IP站群服务器的优势 4.香港站群服务器在SEO优化中的注意事项 1.香港站群服务器的优势 香港站群服务器是为了满足企业SEO优化需求而提供…...

虚拟机内搭建CTFd平台搭建及CTF题库部署,局域网内机器可以访问

一、虚拟机环境搭建 1、安装docker、git、docker-compose ubuntu&#xff1a; sudo apt-get update #更新系统 sudo apt-get -y install docker.io #安装docker sudo apt-get -y install git #安装git sudo apt-get -y install python3-pip #安装pip3 sudo pip install dock…...

qq录屏怎么弄?手把手教会你!

“有没有人知道qq怎么录屏呀&#xff0c;听说qq可以录屏&#xff0c;刚好最近需要录制屏幕&#xff0c;就想用qq去录&#xff0c;但是找了很久&#xff0c;都没找到&#xff0c;有人知道吗&#xff0c;谢谢了。” 在如今数字化时代&#xff0c;屏幕录制已成为广泛使用的工具。…...

一文读懂c++语言

一文读懂C语言 C的发展C的设计目标C的特性C的挑战 C的发展 C是一种通用的、高级的编程语言&#xff0c;它是C语言的扩展。C由Bjarne Stroustrup于1983年首次引入&#xff0c;并在之后的几十年中不断发展壮大。C被广泛应用于各种领域&#xff0c;包括系统开发、游戏开发、嵌入式…...

BERT数据处理,模型,预训练

代码来自李沐老师《动手学pytorch》 在数据处理时&#xff0c;首先执行以下代码 def load_data_wiki(batch_size, max_len):"""加载WikiText-2数据集"""num_workers d2l.get_dataloader_workers()data_dir d2l.download_extract(wikitext-2, w…...

Oracle将与Kubernetes合作推出DevOps解决方案!

导读Oracle想成为云计算领域的巨头&#xff0c;但它不是推出自己品牌的云DevOps软件&#xff0c;而是将与CoreOS在Kubernetes端展开合作。七年前&#xff0c;Oracle想要成为Linux领域的一家重量级公司。于是&#xff0c;Oracle主席拉里埃利森&#xff08;Larry Ellison&#xf…...

微服务与Nacos概述-4

限流规则配置 每次服务重启后 之前配置的限流规则就会被清空因为是内存态的规则对象&#xff0c;所以就要用到Sentinel一个特性ReadableDataSource 获取文件、数据库或者配置中心是限流规则 依赖&#xff1a;spring-cloud-alibaba-sentinel-datasource 通过文件读取限流规则…...

Streamlit 讲解专栏(九):深入探索布局和容器

文章目录 1 前言2 st.sidebar - 在侧边栏增添交互元素2.1 将交互元素添加至侧边栏2.2 示例&#xff1a;在侧边栏添加选择框和单选按钮2.3 特殊元素的注意事项 3 st.columns - 并排布局多元素容器3.1 插入并排布局的容器3.2 嵌套限制 4 st.tabs - 以选项卡形式布局多元素容器4.1…...

使用cloud-int部署nginx

参考 azure创建虚拟机,创建虚拟机注意入站端口规则开放80端口&#xff0c;高级中使用自定义数据&#xff0c;初始化虚拟机&#xff0c;安装nginx 连接CLI&#xff0c;验证是否安装成功 访问虚拟机IP查看是否部署成功 参考文档&#xff1a; https://learn.microsoft.com/zh-cn…...

定量分析计算51单片机复位电路工作原理 怎么计算单片机复位电容和电阻大小

下面画出等效电路图 可以知道单片机内必然有一个电阻RX&#xff0c;为了简化分析&#xff0c;我们假设他是线性电阻&#xff08;不带电容&#xff0c;电感的支路&#xff09; 还有一个基础知识&#xff1a; 电容器的充电放电曲线&#xff1a; 还需要知道电容电压的变化是连续…...

消息队列相关面试题

巩固基础&#xff0c;砥砺前行 。 只有不断重复&#xff0c;才能做到超越自己。 能坚持把简单的事情做到极致&#xff0c;也是不容易的。 面试题 项目上用过消息队列吗&#xff1f;用过哪些&#xff1f;当初选型基于什么考虑的呢&#xff1f; 面试官心理分析 第一&#xff0…...

33 | 美国总统数据分析

在这个数据分析项目中,利用Pandas等Python库对美国2020年7月22日至2020年8月20日期间的超过75万条捐赠数据进行了深入的探索和分析。通过这一分析,他们揭示了这段时间内美国选民对总统候选人的偏好和捐款情况。以下是对文章中的主要步骤和内容的进一步描述: 数据集处理: 作…...

每日一题之常见的排序算法

常见的排序算法 排序是最常用的算法&#xff0c;常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、希尔排序和归并排序。除此之外&#xff0c;还有桶排序、堆排序、基数排序和计数排序。 1、冒泡排序 冒泡排序就是把小的元素往前放或大的元素往后放&#xff0c;比较…...

JVM 类加载和垃圾回收

JVM 1. 类加载1.1 类加载过程1.2 双亲委派模型 2. 垃圾回收机制2.1 死亡对象的判断算法2.2 垃圾回收算法 1. 类加载 1.1 类加载过程 对应一个类来说, 它的生命周期是这样的: 其中前 5 步是固定的顺序并且也是类加载的过程&#xff0c;其中中间的 3 步我们都属于连接&#xf…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...