重温设计模式 --- 命令模式

引言

命令模式是一种行为型设计模式,它将请求封装成一个对象,从而允许你将不同的请求对客户端参数化,将请求排队或记录请求日志,以及支持可撤销的操作。

在命令模式中,有四个主要角色:

  • 接收者(Receiver):接收者是实际执行操作的对象。它定义了如何执行与请求相关的操作。
  • 命令(Command):命令是将请求封装为对象的接口。它包含执行操作的方法,以及可以撤销操作的方法。
  • 调用者(Invoker):调用者是负责将命令发送给接收者的对象。它包含一个命令对象,并在需要执行命令时调用命令的 Execute 方法。
  • 客户端(Client):客户端是使用命令模式的对象。它创建具体的命令对象,并将命令对象传递给调用者,从而实现将请求封装为对象的目的。

下面用c#做一个命令模式示例,它实现了一个简单的遥控器:

接收者

// 接收者:电视
class TV
{
    public void TurnOn()
    {
        Console.WriteLine("The TV is on.");
    }

    public void TurnOff()
    {
        Console.WriteLine("The TV is off.");
    }
}

命令

// 命令接口
interface ICommand
{
    void Execute();
    void Undo();
}

// 具体命令:打开电视
class TVOnCommand : ICommand
{
    private TV tv;

    public TVOnCommand(TV tv)
    {
        this.tv = tv;
    }

    public void Execute()
    {
        tv.TurnOn();
    }

    public void Undo()
    {
        tv.TurnOff();
    }
}

// 具体命令:关闭电视
class TVOffCommand : ICommand
{
    private TV tv;

    public TVOffCommand(TV tv)
    {
        this.tv = tv;
    }

    public void Execute()
    {
        tv.TurnOff();
    }

    public void Undo()
    {
        tv.TurnOn();
    }
}

调用者

// 调用者:遥控器
class RemoteControl
{
    private ICommand command;

    public void SetCommand(ICommand command)
    {
        this.command = command;
    }

    public void PressButton()
    {
        command.Execute();
    }

    public void PressUndoButton()
    {
        command.Undo();
    }
}

客户端

// 客户端代码
static void Main(string[] args)
{
    TV tv = new TV();
    TVOnCommand tvOn = new TVOnCommand(tv);
    TVOffCommand tvOff = new TVOffCommand(tv);

    RemoteControl remoteControl = new RemoteControl();
    remoteControl.SetCommand(tvOn);
    remoteControl.PressButton(); // 输出:The TV is on.

    remoteControl.SetCommand(tvOff);
    remoteControl.PressButton(); // 输出:The TV is off.

    remoteControl.PressUndoButton(); // 输出:The TV is on.
}

在上面的示例中,遥控器是调用者,电视是接收者,TVOnCommandTVOffCommand是具体的命令。调用者将命令对象设置到遥控器中,并通过调用PressButton方法来执行命令,通过调用PressUndoButton方法来撤销命令。当具体的命令被执行时,它会调用接收者的方法来完成特定的操作。

结论

命令模式是一种非常实用的设计模式,它可以帮助我们将请求封装成对象,并实现可撤销操作、命令队列、日志和事务等功能,从而简化代码,提高代码的可读性和可维护性。

posted @ 2023-07-12 08:19  NiueryDiary  阅读(11)  评论(0编辑  收藏  举报