C#命令模式(Command Pattern)实例教程

C#命令模式(Command Pattern)是一种行为型设计模式,它允许将操作请求封装为独立的对象,从而将请求的发起者和接收者解耦。

实现过程

定义命令接口

首先需要定义一个命令接口,它至少应该包含一个执行方法(Execute)和一个撤销方法(Undo):

public interface ICommand
{
    void Execute();
    void Undo();
}

实现具体命令

接下来,针对不同的操作,可以实现不同的命令类,它们都实现了ICommand接口:

public class IncreaseCommand : ICommand
{
    private int _value;
    private readonly Counter _counter;

    public IncreaseCommand(Counter counter, int value)
    {
        _counter = counter;
        _value = value;
    }

    public void Execute()
    {
        _counter.Count += _value;
        Console.WriteLine($"Increase: {_value}, count: {_counter.Count}");
    }

    public void Undo()
    {
        _counter.Count -= _value;
        Console.WriteLine($"Decrease: {_value}, count: {_counter.Count}");
    }
}

public class DecreaseCommand : ICommand
{
    private int _value;
    private readonly Counter _counter;

    public DecreaseCommand(Counter counter, int value)
    {
        _counter = counter;
        _value = value;
    }

    public void Execute()
    {
        _counter.Count -= _value;
        Console.WriteLine($"Decrease: {_value}, count: {_counter.Count}");
    }

    public void Undo()
    {
        _counter.Count += _value;
        Console.WriteLine($"Increase: {_value}, count: {_counter.Count}");
    }
}

上面的代码中,我们定义了两个具体命令:IncreaseCommand和DecreaseCommand。它们都包含一个Counter类型的字段,表示对哪个计数器进行操作。Execute方法进行命令操作,Undo方法则进行撤销操作。

实现命令接收者

接着,定义一个命令接收者,称之为Counter,它包含一个计数变量Count和两个方法:Increase和Decrease,用于对计数器进行增加和减少操作:

public class Counter
{
    public int Count { get; set; }

    public void Increase(int value)
    {
        Count += value;
        Console.WriteLine($"Increase: {value}, count: {Count}");
    }

    public void Decrease(int value)
    {
        Count -= value;
        Console.WriteLine($"Decrease: {value}, count: {Count}");
    }
}

客户端调用

最后,客户端可以创建命令对象,将其加入撤销和重做队列,然后对命令进行调用:

static void Main(string[] args)
{
    var counter = new Counter();

    var increaseCommand = new IncreaseCommand(counter, 10);
    var decreaseCommand = new DecreaseCommand(counter, 5);

    var commandInvoker = new CommandInvoker();
    commandInvoker.Enqueue(increaseCommand);
    commandInvoker.Enqueue(decreaseCommand);

    commandInvoker.Execute();
    commandInvoker.Undo(2);
}

上面的代码中,我们先创建了一个Counter类型的对象,然后创建了两个命令:增加10和减少5,接着将这两个命令加入了撤销和重做队列中,并进行了执行和撤销操作。

示例说明

下面给出两个具体的示例,演示如何使用命令模式。

示例一

假设有一个画图应用程序,我们需要实现撤销和重做操作。我们可以定义一个绘制命令DrawCommand,它包含一个Canvas类型的字段,表示它工作在哪个画布上。DrawCommand构造函数中还传入了绘图指令,执行方法执行绘图操作,撤销方法执行擦除操作。

public class DrawCommand : ICommand
{
    private readonly Canvas _canvas;
    private readonly Shape _shape;

    public DrawCommand(Canvas canvas, Shape shape)
    {
        _canvas = canvas;
        _shape = shape;
    }

    public void Execute()
    {
        _canvas.Draw(_shape);
    }

    public void Undo()
    {
        _canvas.Erase(_shape);
    }
}

其中,Shape表示要绘制的图形,Canvas表示画布。

示例二

假设有一个文本编辑器应用程序,我们需要实现撤销和重做操作。我们可以定义一个编辑命令EditCommand,它包含一个Document类型的字段,表示它工作在哪个文档上。EditCommand构造函数中还传入了编辑指令,执行方法执行编辑操作,撤销方法执行还原操作。

public class EditCommand : ICommand
{
    private readonly Document _document;
    private readonly string _text;

    public EditCommand(Document document, string text)
    {
        _document = document;
        _text = text;
    }

    public void Execute()
    {
        _document.Edit(_text);
    }

    public void Undo()
    {
        _document.Restore();
    }
}

其中,Document表示文档,_text表示要编辑的文本。

以上就是“C#命令模式(Command Pattern)实例教程”的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#命令模式(Command Pattern)实例教程 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • Idea自动生成Entity实现过程详解

    Idea自动生成Entity实现过程详解 在Idea开发环境中,可以使用一些插件或功能自动生成Entity类。下面是详细的实现过程: 1. 安装Lombok插件 Lombok是一款Java的轻量级插件,在Idea中使用可以省略很多冗余的代码。在Idea插件库中安装Lombok插件,安装完成后需要重启Idea。 2. 使用注解生成Entity 使用Lombok…

    C# 2023年6月3日
    00
  • C# Socket数据接收的三种实现方式

    C# Socket数据接收的三种实现方式 前言 在网络通信过程中,数据的传递是至关重要的一个环节,而数据的收发是Socket编程中最为重要的操作之一。本文将探讨Socket数据接收方面的内容,介绍C# Socket数据接收的三种实现方式。 Socket数据接收的三种实现方式 在C# Socket编程中,Socket数据接收主要有以下三种实现方式: 阻塞式接收…

    C# 2023年6月1日
    00
  • .net实现文件读写的几种常用方法

    这里给出“.NET实现文件读写的几种常用方法”的攻略: 一、文件读写方式 在.NET中,实现文件读写主要有以下几种方式: 1.使用FileStream对象 FileStream是.NET中用于操作文件的类,可以使用Read方法读取文件,使用Write方法写入文件。 以下示例是使用FileStream实现写入文件和读取文件的方法: 写入文件 string fi…

    C# 2023年6月1日
    00
  • git 将本地文件(夹)上传到gitee指定分支的处理方法

    如果您想将本地文件或文件夹上传到Gitee指定分支,可以按照以下几个步骤进行。 步骤1:创建本地Git仓库 如果您已经有了本地仓库,请跳过这一步骤。 在本地计算机上创建一个文件夹,然后进入该文件夹,使用以下命令初始化本地Git仓库。 git init 这将在目录中创建一个.git文件夹,其中包含Git配置和版本历史记录。 步骤2:添加文件到Git仓库 将您要…

    C# 2023年5月15日
    00
  • npoi2.0将datatable对象转换为excel2007示例

    针对将DataTable对象转换为Excel2007的问题,可以使用NPOI来实现。步骤分为以下几个:首先创建一个Workbook对象;接着创建一个Sheet对象,指定Sheet名称;然后创建表头header;接着将header插入到Excel表格的第一行中;最后将DataTable中的数据逐行写入Excel表格中。 下面给出两个具体的示例说明: 示例一 u…

    C# 2023年6月8日
    00
  • C#实现装饰器模式

    装饰器模式是一种常用的设计模式,它允许动态地向一个对象添加新的功能。 实现装饰器模式的步骤如下:1. 创建一个抽象组件类(Component),定义需要装饰的对象的共同接口。2. 创建一个具体组件类(ConcreteComponent),实现抽象组件类中定义的方法。3. 创建一个抽象装饰器类(Decorator),继承自抽象组件类,包含一个成员变量,用于保存…

    C# 2023年5月31日
    00
  • Quartz.Net调度框架配置解析

    Quartz.Net调度框架配置解析 介绍 Quartz是一个常见的.NET调度框架,可以用于构建.NET应用程序的时间触发任务。Quartz.NET是Java Quartz的一个直接端口,并在.NET平台上实现了所有Java版的原始功能。 本文将详细解释如何对Quartz的常用配置进行解析。 Quartz配置基础 Quartz的配置包含多个子元素和属性,包…

    C# 2023年5月31日
    00
  • C# 数组查找与排序实现代码

    让我来给你详细讲解一下“C# 数组查找与排序实现代码”的完整攻略: 1. 数组查找 在 C# 中数组查找的实现可以使用线性查找和二分查找两种方式。 1.1 线性查找 线性查找就是从数组第一个元素开始逐一比对,直到找到目标元素或遍历整个数组还没有找到目标元素为止。以下为线性查找的代码示例: public static int LinearSearch(int[…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部