设计模式是经过验证的解决方案,用于解决常见的设计问题并减少代码的复杂性。 四个群体的设计模式分为三类:
- 创作性-与对象创作有关的模式
- 结构-与对象组装有关的模式
- 行为-与对象协作和职责分离有关的模式
命令设计模式属于行为模式类别。 本文探讨了如何在C#中使用命令设计模式。
命令设计模式是什么?
命令设计模式的目的是使动作的请求者与执行动作的对象脱钩。 在命令设计模式中,请求被封装为一个对象,其中包含有关该请求的所有信息。 然后将该对象传递给调用者对象。 然后,调用者对象会寻找适当的对象来处理命令,并将命令传递给该对象。
当您想在应用程序中实现回调,排队任务,跟踪历史记录以及撤消/重做功能时,命令设计模式是一个不错的选择。 命令模式是实现重试机制的一个不错的选择-当您的应用程序想要在稍后的时间点重新尝试连接到服务时(此时此服务尚未运行)。 命令模式还用于消息排队应用程序,即需要从数据丢失中恢复的应用程序。
命令设计模式参与者
在命令模式的经典实现中,您具有四个组件:命令,调用者,接收者和客户端。 命令设计模式的参与者包括:
- 命令-提供用于执行操作的界面
- ConcreteCommand-扩展Command接口并实现Execute方法
- 客户端-实例化ConcreteCommand类
- 调用者—通知命令以执行请求
- 接收器-包含用于执行与请求关联的操作的逻辑
C#中的命令设计模式示例
在下一节中,我们将探讨如何实现命令设计模式。 在我们的示例中,我们将使用以下类实现一个简单的计算器:
- 命令(命令抽象基类)
- SimpleCalculator(接收器类)
- AddCommand(具体命令类)
- SubstractCommand(具体命令类)
- 乘法命令(具体命令类)
- DivideCommand(具体命令类)
- 祈求者(祈求者等级)
在C#中创建Command抽象基类
考虑以下名为Command的抽象基类,其中包含Execute方法的声明。
public abstract class Command
{
protected SimpleCalculator receiver;
public Command(SimpleCalculator receiver)
{
this.receiver = receiver;
}
public abstract int Execute();
}
以下枚举显示了简单计算器将支持的操作。
public enum CommandOption
{
Add, Substract, Multiply, Divide
}
在C#中创建Receiver类
下面是一个名为SimpleCalculator的类。 此类用作Receiver,并包含Add,Subtract,Multiply和Divide方法的定义。
public class SimpleCalculator
{
private int _x, _y;
public SimpleCalculator(int a, int b)
{
_x = a;
_y = b;
}
public int Add()
{
return _x + _y;
}
public int Subtract()
{
return _x - _y;
}
public int Multiply()
{
return _x * _y;
}
public int Divide()
{
return _x / _y;
}
}
在C#中创建具体的命令类
具体的命令类扩展了Command抽象基类并实现Execute方法,如下所示。
public class AddCommand : Command
{
private SimpleCalculator _calculator;
public AddCommand(SimpleCalculator calculator) : base(calculator)
{
_calculator = calculator;
}
public override int Execute()
{
return _calculator.Add();
}
}
public class SubtractCommand : Command
{
private SimpleCalculator _calculator;
public SubtractCommand(SimpleCalculator calculator) :
base(calculator)
{
_calculator = calculator;
}
public override int Execute()
{
return _calculator.Subtract();
}
}
public class MultiplyCommand : Command
{
private SimpleCalculator _calculator;
public MultiplyCommand(SimpleCalculator calculator) :
base(calculator)
{
_calculator = calculator;
}
public override int Execute()
{
return _calculator.Multiply();
}
}
public class DivideCommand : Command
{
private SimpleCalculator _calculator;
public DivideCommand(SimpleCalculator calculator) :
base(calculator)
{
_calculator = calculator;
}
public override int Execute()
{
return _calculator.Divide();
}
}
在C#中创建Invoker类
以下代码段说明了Invoker类。 它包含两个方法,SetCommand和Execute。 SetCommand用于将命令对象分配给Invoker类中的专用Command引用,而Execute用于执行命令。
public class Invoker
{
private Command _command;
public void SetCommand(Command command)
{
_command = command;
}
public int Execute()
{
return _command.Execute();
}
}
C#中运行的命令设计模式
最后,以下代码片段说明了如何使用SimpleCalculator类执行简单的计算。
static void Main(string[] args)
{
SimpleCalculator calculator = new SimpleCalculator(15, 3);
var addCommand = new AddCommand(calculator);
var substractCommand = new SubtractCommand(calculator);
var multiplyCommand = new MultiplyCommand(calculator);
var divideCommand = new DivideCommand(calculator);
Invoker invoker = new Invoker();
invoker.SetCommand(addCommand);
Console.WriteLine("Result is {0}", invoker.Execute());
invoker.SetCommand(substractCommand);
Console.WriteLine("Result is {0}", invoker.Execute());
invoker.SetCommand(multiplyCommand);
Console.WriteLine("Result is {0}", invoker.Execute());
invoker.SetCommand(divideCommand);
Console.WriteLine("Result is {0}", invoker.Execute());
Console.ReadLine();
}
命令设计模式提供了对可扩展性的支持,并减少了命令的调用者和接收者之间存在的耦合。 由于请求被封装到独立对象中,因此您可以对具有不同请求的方法进行参数化,将请求保存在队列中,甚至为可重做或可撤消操作提供支持。
-
使用C#执行更多操作:
- 如何在C#中使用AutoMapper
- 何时在C#中使用抽象类与接口
- 如何在C#中使用线程
- 如何在C#中使用Dapper ORM
- 如何在C#中实现存储库设计模式
- 如何在C#中实现一个简单的记录器
- 如何在C#中与委托人一起工作
- 如何在C#中与Action,Func和Predicate委托一起使用
- 如何在C#中使用log4net
- 如何在C#中使用反射
From: https://www.infoworld.com/article/3409800/how-to-use-the-command-design-pattern-in-c.html