陈巧倩

设计模式-命令模式

· 220 words · 2 minutes to read
Categories: CSharp
Tags: Design Pattern

Command命令模式属于行为型设计模式,将请求封装为一个对象,从而允许对不同请求的客户端进行参数化,并提供请求的历史记录。它还允许撤销请求。

Design Pattern:Command 🔗

基本介绍 🔗

构成 🔗

  • Client:客户角色类,创建具体的命令对象,并且设置命令对象的接收者。
  • Command:命令接口,声明一个用于执行操作的接口。
  • ConcreteCommand:具体命令类,Command的实现对象,要持有Receiver,并调用Receiver的功能来完成命令要执行的操作。
  • Invoker:请求者类,使用命令对象的入口,持有很多命令对象,真正触发命令并要求命令执行相应操作的地方。
  • Receiver:接受者类,真正执行命令的对象。

优点 🔗

  • 命令模式属于可扩展的设计模式,可以在不更改或干扰现有类和代码的情况下添加更多命令。
  • 可以实现命令延迟。
  • 对命令进行记录的功能,可以实现对请求的Undo和Redo操作。
  • 多个命令对象可以组合使用,形成复杂的命令。

缺点 🔗

  • 代码变得负责,同时增加出不少具体命令类。

实例 🔗

C#中命令模式的实例,我干了两天厨师觉得不太累了,于是决定改行房地产,于是我来到了家族旗下的房地产公司当起了建筑师,主要任务是盖房。

/// <summary>
/// Receiver 接受者类
/// </summary>
public class Receiver
{
    public void BuildWall()
    {
        Console.WriteLine("建造墙体。");
    }
    public void PullDownWall()
    {
        Console.WriteLine("拆毁墙体。");
    }
    public void BuildRoof()
    {
        Console.WriteLine("建造房顶。");
    }
    public void PullDownRoof()
    {
        Console.WriteLine("拆毁房顶。");
    }
}
/// <summary>
/// Command 命令接口
/// </summary>
public interface ICommand
{
    /// <summary>
    /// 执行
    /// </summary>
    void Do();
    /// <summary>
    /// 撤销
    /// </summary>
    void UnDo();
}

/// <summary>
/// ConcreteCommand 建墙
/// </summary>
public class BuildWallCmd : ICommand
{
    private readonly Receiver _receiver;

    public BuildWallCmd(Receiver receiver)
    {
        _receiver = receiver;
    }
    public void Do()
    {
        _receiver.BuildWall();
    }
    public void UnDo()
    {
        _receiver.PullDownWall();
    }
}

/// <summary>
/// ConcreteCommand 建房顶
/// </summary>
public class BuildRoofCmd : ICommand
{
    private readonly Receiver _receiver;

    public BuildRoofCmd(Receiver receiver)
    {
        _receiver = receiver;
    }
    public void Do()
    {
        _receiver.BuildRoof();
    }
    public void UnDo()
    {
        _receiver.PullDownRoof();
    }
}

/// <summary>
/// Invoker 调用类
/// </summary>
public class Invoker
{
    /// <summary>
    /// 执行指令记录
    /// </summary>
    private readonly List<ICommand> _commands = new List<ICommand>();

    public void AddAndExecute(ICommand command)
    {
        _commands.Add(command);
        command.Do();
    }
}

实际运行:

Receiver receiver = new Receiver();
Invoker invoker = new Invoker();
BuildWallCmd buildWallCmd = new BuildWallCmd(receiver);
BuildRoofCmd buildRoofCmd = new BuildRoofCmd(receiver);
invoker.AddAndExecute(buildWallCmd);
invoker.AddAndExecute(buildRoofCmd);

结论 🔗

搬砖愉快!