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

前言

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

代码

#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

运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/924716.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用zabbix监控k8s

一、 参考文献 小阿轩yx-案例&#xff1a;Zabbix监控kubernetes云原生环境 手把手教你实现zabbix对Kubernetes的监控 二、部署经验 关于zabbix监控k8s&#xff0c;总体来说是分为两块内容&#xff0c;一是在k8s集群部署zabbix-agent和zabbix- proxy。二是在zabbix进行配置。…

ThingsBoard规则链节点:GCP Pub/Sub 节点详解

目录 引言 1. GCP Pub/Sub 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 数据传输 3.2 数据分析 3.3 事件通知 3.4 任务调度 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台&#xff0…

10.机器学习--集成学习

机器学习领域有一个强大的思路&#xff1a;集成学习&#xff0c;该方法在诸多机器学习竞赛中往往能够获得最优的结果。集成学习的基本思想实际上非常简单&#xff1a;三个臭皮匠顶一个诸葛亮&#xff0c;即将多个模型组合在一起获得的效果往往要强于单一模型。 目录 集成学习…

结构体详解+代码展示

系列文章目录 &#x1f388; &#x1f388; 我的CSDN主页:OTWOL的主页&#xff0c;欢迎&#xff01;&#xff01;&#xff01;&#x1f44b;&#x1f3fc;&#x1f44b;&#x1f3fc; &#x1f389;&#x1f389;我的C语言初阶合集&#xff1a;C语言初阶合集&#xff0c;希望能…

深度解析猎板 PCB树脂塞孔工艺

PCB 的树脂塞孔工艺是一种在印制电路板制造过程中广泛应用的重要技术&#xff0c;以下是猎板PCB批量工厂对PCB树脂塞孔该工艺的详细介绍&#xff1a; 猎板 PCB树脂塞孔工艺目的 防止短路&#xff1a;在 PCB 制造中&#xff0c;若过孔未被有效封堵&#xff0c;锡膏可能会从孔内…

扫雷-完整源码(C语言实现)

云边有个稻草人-CSDN博客 在学完C语言函数之后&#xff0c;我们就有能力去实现简易版扫雷游戏了&#xff08;成就感满满&#xff09;&#xff0c;下面是扫雷游戏的源码&#xff0c;快试一试效果如何吧&#xff01; 在test.c里面进行扫雷游戏的测试&#xff0c;game.h和game.c…

当前就业形势下C++方向后端开发学习指南

文章目录 1. C后端开发的职业方向1.1 C的应用领域1.2 后端开发的职业选择 2. 当前就业形势分析2.1 C开发者的市场需求2.2 C开发者的薪资水平 3. 学习路线3.1 入门阶段&#xff1a;掌握基础知识3.2 进阶阶段&#xff1a;掌握后端开发的核心技术3.2.1 数据库与C3.2.2 网络编程 3.…

FFmpeg 简介与编译

1. ffmpeg 简介&#xff1a; FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec&#xff0c;为了保证高可移…

【论文复现】BERT论文解读及情感分类实战

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ BERT论文解读及情感分类实战 简介BERT文章主要贡献BERT模型架构技术细节任务1 Masked LM&#xff08;MLM&#xff09;任务2 Next Sentence P…

Flink高可用配置(HA)

从Flink架构中我们可以看到,JobManager这个组件非常重要,是中心协调器,负责任务调度和资源管理。默认情况下,每个Flink集群只有一个JobManager实例。这会产生单点故障(SPOF):如果JobManager崩溃,则无法提交新程序,正在运行的程序也会失败。通过JobManager的高可用性,…

【Rabbitmq篇】高级特性----事务,消息分发

目录 事务 消息分发 应用场景 1. 限流 2.负载均衡 事务 RabbitMQ是基于AMQP协议实现的,该协议实现了事务机制,因此RabbitMQ也支持事务机制.SpringAMQP也提供了对事务相关的操作.RabbitMQ事务允许开发者确保消息的发送和接收是原子性的,要么全部成功,要么全部失败. 何为原…

优先算法 —— 双指针系列 - 有效三角形的个数

1. 有效三角形的个数 题目链接&#xff1a; 611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/valid-triangle-number/description/ 2. 题目解析 以示例1为例&#xff1a; 3. 优化 我们都知道&#xff0c;判断三角形的方法就是两边相…

【H2O2|全栈】Node.js(2)

目录 前言 开篇语 准备工作 npm 概念 常见指令 项目中的包 创建项目 启动项目 服务器搭建 express 基本步骤 搭建应用 创建路由 监听端口 启动服务器 面试相关 结束语 前言 开篇语 本系列博客分享Node.js的相关知识点&#xff0c;本章讲解npm与服务器的简单…

Android 13 Aosp 默认允许应用动态权限

图库 frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java 修改 public void grantDefaultPermissions(int userId) {DelayingPackageManagerCache pm new DelayingPackageManagerCache();grantPermissionsToSysCompon…

【NLP高频面题 - LLM架构篇】LLM对Transformer都有哪些优化?

【NLP高频面题 - LLM架构篇】LLM对Transformer都有哪些优化&#xff1f; ⚠︎ 重要性&#xff1a;★★★ &#x1f4af; NLP Github 项目&#xff1a; NLP 项目实践&#xff1a;fasterai/nlp-project-practice 介绍&#xff1a;该仓库围绕着 NLP 任务模型的设计、训练、优化、…

DAY139权限提升-Linux系统权限提升篇Vulnhub辅助项目SUID权限SUDO指令版本漏洞

Linux提权 1、内核溢出提权 2、suid、sudo、nfs、path、ld_preload、cron、lxd、capability、rbash等 3、数据库类型提权 Linux&#xff1a; 系统用户&#xff1a;UID(0-999) 普通用户&#xff1a;UID(1000-*) root用户&#xff1a;UID为0&#xff0c;拥有系统的完全控制…

notepad++文件github下载

1、github下载网址&#xff1a;Releases notepad-plus-plus/notepad-plus-plus GitHub 2、找到操作系统支持的软件&#xff1a; 3、CSDN下载链接&#xff1a;https://download.csdn.net/download/u013083576/90046203

无人机应用板卡详解!

一、核心技术 无人机板卡的核心技术主要包括但不限于以下几种&#xff1a; 通信技术&#xff1a;无人机板卡通常集成了各种通信技术&#xff0c;如无线电通信、卫星通信等&#xff0c;以实现远程控制和数据传输。这些技术确保了无人机能够在复杂环境中保持稳定的通信连接。 …

分布式链路追踪系统

系统现状及需要解决的问题 系统异常无法接收告警 系统总会有这样或者那样的问题&#xff0c;同样的现象可能是不同的系统问题引起的&#xff0c;解决这些问题是研发的基本职责之一。 但是解决问题的前提是发现问题&#xff0c;系统告警就是我们发现感知问题的重要的手段&…

qt音频实战

一、Qt音频基础知识 1、QT multimedia 2、QMediaPlayer类&#xff1a;媒体播放器&#xff0c;主要用于播放歌曲、网络收音机等功能。 3、QMediaPlaylist类&#xff1a;专用于播放媒体内容的列表。 二、界面设计 三、代码 #include "mainwindow.h" #include "…