【C#设计模式(15)——命令模式(Command Pattern)】

news/2024/12/1 13:31:41/

前言

命令模式的关键通过将请求封装成一个对象,使命令的发送者和接收者解耦。这种方式能更方便地添加新的命令,如执行命令的排队、延迟、撤销和重做等操作。

代码

#region 基础的命令模式
//命令(抽象类)
public abstract class Command
{public abstract void Execute();
}
//发送命令
public class SendCommand : Command
{private Receiver receiver;public SendCommand(Receiver receiver){this.receiver = receiver;}public override void Execute(){receiver.Execute();}
}
//接收命令
public class Receiver
{public void Execute(){Console.WriteLine("receiver execute the command...");}
}
//调用者命令
public class Invoker
{private Command command;public void SetCommand(Command command){this.command = command;}public void ExecuteCommand(){command.Execute();}
}
#endregion#region 添加新的命令模式
//新命令
public class NewCommand : Command
{private NewReceiver newReceiver;public NewCommand(NewReceiver newReceiver){this.newReceiver = newReceiver;}public override void Execute(){newReceiver.Execute();}
}
//使用新接收者
public class NewReceiver
{public void Execute(){Console.WriteLine("new reveiver execute the newCommand...");}
}#endregion#region 命令的请求的排队和延迟执行
//命令执行者
public class CommandInvoker
{private List<Command> commandQueue = new List<Command>();public void AddCommand(Command command){commandQueue.Add(command);}public void ExecuteCommands(){foreach (Command command in commandQueue){command.Execute();}commandQueue.Clear();}public void DelayExecute(Command command,int delay){Console.WriteLine($"等待开始....时间:{delay}ms");new Thread(() =>{Console.WriteLine($"延时执行开始==>");Thread.Sleep(delay);command.Execute();Console.WriteLine($"finish time:{Environment.NewLine}{DateTime.Now.ToString("HH:mm:ss fff")}");Console.WriteLine($"==>延时执行完毕...");}).Start();}
}
#endregion#region 命令撤销和重做操作
public interface ICommand
{void Execute();void Undo(); 
}public class HistoryCommand : ICommand
{private HistoryReceiver historyReceiver;public HistoryCommand(HistoryReceiver historyReceiver){this.historyReceiver = historyReceiver;}public void Execute(){historyReceiver.Execute();}public void Undo(){historyReceiver.UndoExecute();}
}public class HistoryReceiver
{public void Execute(){Console.WriteLine("history receiver executes the command...");}public void UndoExecute(){Console.WriteLine("history receiver undoes the command...");}
}
public class HistoryInvoker
{private Stack<ICommand> commandStack = new Stack<ICommand>();public void ExecuteCommand(ICommand command){command.Execute();commandStack.Push(command);}public void Undo(){if (commandStack.Count > 0){ICommand command = commandStack.Pop();Console.WriteLine("command Undo");command.Undo();}else{Console.WriteLine("No commands to undo.");}}public void Redo(){if (commandStack.Count>0){ICommand command = commandStack.Peek();Console.WriteLine("command Redo");command.Execute();}else{Console.WriteLine("No commands to redo.");}}
}/** 行为型模式:Behavioral Pattern* 命令模型:Command Pattern*/internal class Program{static void Main(string[] args){//命令模式:简单实现Receiver receiver = new Receiver();Command sendCommand = new SendCommand(receiver);Invoker invoker = new Invoker();invoker.SetCommand(sendCommand);invoker.ExecuteCommand();Console.WriteLine("添加新命令------------------------------------");// 命令模式:添加新命令NewReceiver newReceiver = new NewReceiver();Command newCommand = new NewCommand(newReceiver);invoker.SetCommand(newCommand);invoker.ExecuteCommand();Console.WriteLine("请求队列------------------------------------");//命令模式:请求队列Receiver receiver1 = new Receiver();Command command1 = new SendCommand(receiver1);Command command2 = new SendCommand(receiver1);CommandInvoker commandInvoker = new CommandInvoker();commandInvoker.AddCommand(command1);commandInvoker.AddCommand(command2);commandInvoker.ExecuteCommands();Console.WriteLine("延时执行------------------------------------");Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss fff")}");//命令模式:延时执行commandInvoker.DelayExecute(command1,1000);Console.WriteLine("准备撤销重做------------------------------------");HistoryReceiver historyReceiver = new HistoryReceiver();ICommand command3 = new HistoryCommand(historyReceiver);ICommand command4 = new HistoryCommand(historyReceiver);HistoryInvoker historyInvoker = new HistoryInvoker();historyInvoker.ExecuteCommand(command3);historyInvoker.ExecuteCommand(command4);Console.WriteLine("执行撤销重做------------------------------------");//撤销最后一个命令historyInvoker.Undo();historyInvoker.Undo();//重做最后一个撤销命令historyInvoker.Redo();Console.WriteLine("END------------------------------------");Console.ReadLine();}}
#endregion

运行结果

在这里插入图片描述


http://www.ppmy.cn/news/1551497.html

相关文章

Redis开发02:redis.windows-service.conf 默认配置文件解析与注解

文件位置&#xff1a;redis安装目录下的 redis.windows-service.conf &#xff0c;存放了redis服务的相关配置&#xff0c;下面列举出默认配置的含义&#xff1a; 配置项含义bind 127.0.0.1限制 Redis 只监听本地回环地址&#xff0c;意味着只能从本地连接 Redis。protected-m…

Flink的双流join理解

如何保证Flink双流Join准确性和及时性、除了窗口join还存在哪些实现方式、究竟如何回答才能完全打动面试官呢。。你将在文中找到答案。 1 引子 1.1 数据库SQL中的JOIN 我们先来看看数据库SQL中的JOIN操作。如下所示的订单查询SQL&#xff0c;通过将订单表的id和订单详情表ord…

物料理解笔记·蓝白段子线·端子线座子焊接反了怎么处理!!!

目录 蓝白端子排线 端子线座子焊接错了怎么办 端子线如何拆线 编写不易&#xff0c;请勿搬运&#xff0c;仅供学习&#xff0c;感谢理解 蓝白端子排线 蓝白端子排线&#xff0c;这种端子线常用与编码电机的接线&#xff0c;或者在板子上通过提供段子线的接口&#xff0c;通…

Java 单例模式:深度解析与应用

在软件开发领域&#xff0c;设计模式是解决常见设计问题的有效方案&#xff0c;而单例模式作为创建型设计模式中的一员&#xff0c;其重要性不容小觑。它能够确保一个类仅有一个实例&#xff0c;并提供全局访问点&#xff0c;这一特性在资源管理、配置信息读取、线程池管理以及…

三维渲染中顺序无关的半透明混合(OIT)(一Depth Peeling)

>本文收集关于透明对象渲染技术中关于OIT技术的资料&#xff0c;尝试用简单的逻辑对这些内容进行整理。 1、透明对象的特殊对待 不要小瞧png图片和jpg图片的差异&#xff01;在一般的三维平台&#xff0c;png代表的是带透明通道的纹理&#xff0c;而jpg代表的是不带透明的…

Fastadmin系统配置增加配置字段类型

项目有一个上传APK安装包文件的需求&#xff0c;使用框架自带的 ‘文件’ 类型&#xff0c;每次都是不同路径不同文件名。希望保持固定路径和文件名所以就自己写加了一个类型&#xff0c;需要修改的地方如下&#xff1a; 1. app\common\model\Config.php 在 getTypeList 方法中…

记录一些虚拟机桥接网络,windows网络遇到的小问题

1 virtual box 桥接的虚拟系统无 ipv4 地址 https://blog.csdn.net/qq_44847649/article/details/122582954 原因是 wlan 无线网卡没开共享给 virtual box host only (之前用过 vmware 也类似) 2 无法两台 windows10 物理机无法相互 ping 通 https://blog.csdn.net/qq_35…

TiDB 优化器丨执行计划和 SQL 算子解读最佳实践

作者&#xff1a; TiDB社区小助手 原文来源&#xff1a; https://tidb.net/blog/5edb7933 导读 在数据库系统中&#xff0c;查询优化器是数据库管理系统的核心组成部分&#xff0c;负责将用户的 SQL 查询转化为高效的执行计划&#xff0c;因而会直接影响用户体感的性能与稳…