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#微信公众号开发之服务器配置

    C#微信公众号开发之服务器配置 本文主要介绍在使用C#进行微信公众号开发过程中,如何进行服务器配置,以让公众号接收用户消息和事件以及进行回复。下面就是服务器配置的完整攻略: 1. 登录开发者平台 首先,在微信公众平台官网登录自己的开发者账号,然后进入“开发->基本配置”界面,在该界面获取自己的AppID和AppSecret,为后面进行开发提供必要的认证…

    C# 2023年6月6日
    00
  • C# 函数返回多个值的方法详情

    下面我给你讲解一下C#函数返回多个值的方法详情: 1. 使用out关键字 使用out关键字是一个简单的方式,可以让函数返回多个值。out参数必须在方法内部赋值,否则编译器会报错。下面是一个返回三个整数的函数示例: public void GetValues(out int val1, out int val2, out int val3) { val1 = …

    C# 2023年5月15日
    00
  • asp.net网站开发包wq.dll打包下载

    下面是“asp.net网站开发包wq.dll打包下载”的完整攻略: 1. 什么是wq.dll wq.dll 是一个 asp.net 网站开发包,其中包含常用的 asp.net 库文件和依赖文件以及资源文件等。通过安装 wq.dll ,我们可以方便地在 asp.net 网站开发过程中使用常用的库文件和工具,提高开发效率。 2. 如何打包wq.dll 以下是打包…

    C# 2023年5月31日
    00
  • .NetCore获取Json和Xml格式的配置信息

    .NET Core 获取 JSON 和 XML 格式的配置信息攻略 在 .NET Core 中,可以使用配置文件来存储应用程序的配置信息。配置文件可以使用 JSON 或 XML 格式。本攻略将详细讲解如何在 .NET Core 中获取 JSON 和 XML 格式的配置信息。 1. 获取 JSON 格式的配置信息 以下是获取 JSON 格式的配置信息的步骤: …

    C# 2023年5月17日
    00
  • c# yield提高代码性能和可读性

    C#中的yield关键字可以用于定义“迭代器方法”,使得编写迭代器的代码变得简单和易读,看起来就像是在编写一个普通的方法。yield关键字能够让程序员更加专注于业务逻辑,而不是那些与迭代器相关的底层问题。 下面是详细的攻略: 什么是C#中的迭代器方法? C#中的迭代器方法使用yield语句来生成序列。它们通常是返回IEnumerable的方法,其中T是序列中…

    C# 2023年6月7日
    00
  • C#隐式/显示实现接口方法详解

    C#隐式/显示实现接口方法详解 在 C# 中,接口是构建松散耦合系统的一种有用的机制。类可以继承自多个接口,并根据需要实现这些接口的方法。 当类实现多个接口并且这些接口拥有同样的方法名称时,我们需要使用隐式或显示接口实现,以解决命名冲突和实现特定接口的方法的问题。下面将详细讲解 C# 中的隐式和显示实现接口方法。 隐式实现接口方法 为了实现一个接口方法,类所…

    C# 2023年5月15日
    00
  • CommunityToolkit.Mvvm8.1 viewmodel源生成器写法(3)

      本系列文章导航 https://www.cnblogs.com/aierong/p/17300066.html https://github.com/aierong/WpfDemo (自我Demo地址) 希望提到的知识对您有所提示,同时欢迎交流和指正 作者:aierong出处:https://www.cnblogs.com/aierong   说明 Co…

    C# 2023年4月17日
    00
  • C#字符串与正则表达式的图文详解

    C#字符串与正则表达式的图文详解 1. 什么是正则表达式 正则表达式(Regular Expression)是一种用来描述、匹配文本字符串的工具,它是由元字符和字符组成的表达式。使用正则表达式可以快捷方便的实现字符串的匹配、查找与替换等操作。 2. 正则表达式的基本语法 2.1 元字符 元字符是正则表达式中的特殊字符,其在匹配过程中具有特殊含义,常见的元字符…

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