命令模式是一种行为设计模式,它将请求转换为包含有关请求的信息的独立对象。这种解耦允许用户使用操作参数化对象,延迟操作的执行或将其排队,并支持可撤消的操作。在这篇博文中,我们将深入探讨 C# 中的命令模式,从基础开始,然后转向高级用例。
命令模式将请求封装为对象,从而允许用户使用不同的请求、队列请求和支持撤消/重做等操作来参数化客户端。
让我们从一个基本的例子开始:一个灯的遥控器。
// Command
public interface ICommand
{
void Execute();
}
// Receiver
public class Light
{
public void On()
{
Console.WriteLine("Light is ON");
}
public void Off()
{
Console.WriteLine("Light is OFF");
}
}
// ConcreteCommand
public class LightOnCommand : ICommand
{
private Light _light;
public LightOnCommand(Light light)
{
_light = light;
}
public void Execute()
{
_light.On();
}
}
// Invoker
public class RemoteControl
{
private ICommand _command;
public void SetCommand(ICommand command)
{
_command = command;
}
public void PressButton()
{
_command.Execute();
}
}
// Client
var light = new Light();
var lightOn = new LightOnCommand(light);
var remote = new RemoteControl();
remote.SetCommand(lightOn);
remote.PressButton(); // Output: Light is ON
为了支持撤消和重做,可以使用 和 方法扩展 Command 接口。Undo()Redo()
public interface ICommand
{
void Execute();
void Undo();
void Redo();
}
public class LightOnCommand : ICommand
{
// ... rest of the class
public void Undo()
{
_light.Off();
}
public void Redo()
{
_light.On();
}
}
宏命令是按顺序执行的一系列命令。当您想要使用单个操作执行多个命令时,这很有用。
public class MacroCommand : ICommand
{
private List<ICommand> _commands;
public MacroCommand(List<ICommand> commands)
{
_commands = commands;
}
public void Execute()
{
foreach (var command in _commands)
{
command.Execute();
}
}
// Implement Undo() and Redo() similarly
}
有时,您可能需要将参数传递给命令。这可以通过修改方法以接受参数或通过设置命令对象的属性来实现。Execute()
public class CalculatorCommand : ICommand
{
private Calculator _calculator;
private char _operator;
private int _operand;
public CalculatorCommand(Calculator calculator, char @operator, int operand)
{
_calculator = calculator;
_operator = @operator;
_operand = operand;
}
public void Execute()
{
_calculator.Operation(_operator, _operand);
}
// Implement Undo() and Redo() accordingly
}
命令可以排队等待以后执行。这在线程池等方案中很有用。
public class CommandQueue
{
private Queue<ICommand> _commands = new Queue<ICommand>();
public void AddCommand(ICommand command)
{
_commands.Enqueue(command);
}
public void ExecuteCommands()
{
while (_commands.Count > 0)
{
var command = _commands.Dequeue();
command.Execute();
}
}
}
命令模式是一种通用的设计模式,它提供了一种干净的方式来分离发送方和接收方。这种解耦在需要使用操作参数化对象、延迟操作执行或支持可撤消操作的场景下非常有用。通过了解和实现此模式,可以在 C# 中编写更模块化、更灵活且可维护的代码。