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技术站