C# 中的命令模式:从基础到高级

作者:微信公众号:【架构师老卢】
2-18 19:33
20

概述:命令模式是一种行为设计模式,它将请求转换为包含有关请求的信息的独立对象。这种解耦允许用户使用操作参数化对象,延迟操作的执行或将其排队,并支持可撤消的操作。在这篇博文中,我们将深入探讨 C# 中的命令模式,从基础开始,然后转向高级用例。命令模式的基础知识概念命令模式将请求封装为对象,从而允许用户使用不同的请求、队列请求和支持撤消/重做等操作来参数化客户端。参与者命令:声明用于执行操作的接口。ConcreteCommand:定义 Receiver 对象和操作之间的绑定。客户端:创建 ConcreteCommand 对象并设置其接收器。Invoker:要求命令执行请求。接收方:知道如何执行与执行请求

命令模式是一种行为设计模式,它将请求转换为包含有关请求的信息的独立对象。这种解耦允许用户使用操作参数化对象,延迟操作的执行或将其排队,并支持可撤消的操作。在这篇博文中,我们将深入探讨 C# 中的命令模式,从基础开始,然后转向高级用例。

命令模式的基础知识

概念

命令模式将请求封装为对象,从而允许用户使用不同的请求、队列请求和支持撤消/重做等操作来参数化客户端。

参与者

  1. 命令:声明用于执行操作的接口。
  2. ConcreteCommand:定义 Receiver 对象和操作之间的绑定。
  3. 客户端:创建 ConcreteCommand 对象并设置其接收器。
  4. Invoker:要求命令执行请求。
  5. 接收方:知道如何执行与执行请求相关的操作。

实现简单

让我们从一个基本的例子开始:一个灯的遥控器。

// 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

命令模式的高级用法

1. 撤消和重做操作

为了支持撤消和重做,可以使用 和 方法扩展 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();  
    }  
}

2. 宏命令

宏命令是按顺序执行的一系列命令。当您想要使用单个操作执行多个命令时,这很有用。

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  
}

3. 带参数的命令

有时,您可能需要将参数传递给命令。这可以通过修改方法以接受参数或通过设置命令对象的属性来实现。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  
}

4. 命令队列

命令可以排队等待以后执行。这在线程池等方案中很有用。

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# 中编写更模块化、更灵活且可维护的代码。

相关留言评论
昵称:
邮箱:
阅读排行