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日

相关文章

  • C#插入图片到Excel表格单元格代码详解

    下面是详细讲解“C#插入图片到Excel表格单元格代码详解”的完整攻略。 简介 在使用C#处理Excel表格的过程中,插入图片是一个常见的需要,本文将讲解如何使用C#代码将图片插入到Excel表格单元格中。 准备工作 在开始之前,需要先检查电脑是否安装了Microsoft Office软件(包括Excel),还需要安装Excel程序集,以便我们可以在C#中使…

    C# 2023年6月6日
    00
  • 深入.net调用webservice的总结分析

    《深入.NET调用Web Service的总结分析》是一篇介绍.Net平台下调用Web服务的文章。其内容主要包括Web服务的概念介绍、使用.Net框架下的方式调用Web服务的具体步骤、调用WebService是需要注意的问题等。 概述 Web服务(Web service)是指通过Internet对外提供的可以被远程应用程序调用的程序接口。在.Net平台下可以…

    C# 2023年6月6日
    00
  • 很有用的学习ASP常用到的代码第1/2页

    下面是关于“很有用的学习ASP常用到的代码第1/2页”的详细讲解攻略。 什么是ASP? ASP(Active Server Pages)是一种用于开发动态网站的服务器端脚本语言,它可以与HTML、CSS、JavaScript和数据库等技术结合使用,实现动态网站的开发和设计。 很有用的学习ASP常用到的代码第1/2页 这篇文章收集了一些常用的ASP代码,包括连…

    C# 2023年5月31日
    00
  • C#异常处理详解

    下面我将详细讲解“C#异常处理详解”的完整攻略。 什么是异常? 异常(Exception)是指在程序执行过程中出现的错误状况,如内存不足、数组越界、数学计算异常等。这些错误状况可能会导致程序异常终止,而异常处理就是解决这些问题的方法。 异常处理的方法 在C#中,我们可以使用try-catch语句来处理异常。try块中放置我们要执行的代码,如果在执行过程中出现…

    C# 2023年6月6日
    00
  • C# 调用命令行执行Cmd命令的操作

    C# 调用命令行执行 Cmd 命令可以通过使用 Process 类实现。下面是具体步骤: 1. 引用命名空间 在 C# 中使用 Process 类需要引用 System.Diagnostics 命名空间,因此需要在文件头部添加以下代码: using System.Diagnostics; 2. 创建 Process 对象 创建一个 Process 对象,可以…

    C# 2023年6月7日
    00
  • 用序列化实现List 实例的深复制(推荐)

    使用序列化实现List实例的深复制可以保证复制后的实例与原实例完全独立而不会相互影响。下面是使用序列化实现List实例深复制的详细攻略: 什么是深复制 深复制是指复制对象时,每个对象都会被单独复制一份,这两份对象完全独立而相互没有影响。这与浅复制不同,浅复制只是把对象的引用复制一份,这样两个对象会共用同一个引用,从而相互影响。 使用序列化实现深复制 针对Li…

    C# 2023年5月31日
    00
  • C#数组反转与排序实例分析

    关于“C#数组反转与排序实例分析”,我们可以按照以下步骤进行分析。 1. 数组反转 数组反转是指将数组元素按相反的顺序重新排列。在 C# 中,对于数组一维对象而言,可以使用 Array 类的 Reverse() 方法实现数组元素的反转操作。下面是反转数组元素的示例代码: int[] array = {1, 2, 3, 4, 5}; // 定义一个整型数组 A…

    C# 2023年6月1日
    00
  • C#之多余控件事件及代码删除问题

    标题:C#之多余控件事件及代码删除问题 正文: 在使用C#编写Windows应用程序时,我们有时会再设计界面时添加一些控件,后来又发现这些控件用处不大,或者我们修改了设计,需要删除这些控件,但却发现这些控件和它们绑定的事件和代码并没有完全删除。这就是所谓的多余控件事件及代码删除问题。 问题原因 造成多余控件事件及代码删除问题的原因主要有两个: 控件从设计器中…

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