设计模式--命令模式

2023-07-18 19:58:31 浏览数 (1)

命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成对象,以便可以将不同的请求参数化,队列化或记录日志,以及支持可撤销操作。在命令模式中,包含一个命令接口和具体的命令实现类,以及一个调用者(invoker)类和一个接收者(receiver)类。调用者通过调用接口中的方法执行命令,发起请求,接收者则负责实际执行命令。这种设计模式将调用者和接收者解耦,使得系统更加灵活。

具体来说,命令模式中包含以下角色:

  • Command:定义一个命令接口,通常包含一个execute()方法,用于执行命令操作。
  • ConcreteCommand:继承或实现 Command 接口,并实现execute()方法,执行具体的命令操作。
  • Receiver:定义接收者,负责实际执行命令操作。
  • Invoker:调用者角色,负责调用具体的命令执行。它包含一个指向 Command 接口的引用,用于发起命令请求。

下面是一个使用 C# 实现的命令模式示例:

代码语言:javascript复制
using System;

// 定义命令接口
public interface ICommand
{
    void Execute();
}

// 具体命令类A
public class ConcreteCommandA : ICommand
{
    private Receiver receiver;

    public ConcreteCommandA(Receiver receiver)
    {
        this.receiver = receiver;
    }

    public void Execute()
    {
        receiver.Action("ConcreteCommandA");
    }
}

// 具体命令类B
public class ConcreteCommandB : ICommand
{
    private Receiver receiver;

    public ConcreteCommandB(Receiver receiver)
    {
        this.receiver = receiver;
    }

    public void Execute()
    {
        receiver.Action("ConcreteCommandB");
    }
}

// 接收者角色
public class Receiver
{
    public void Action(string commandName)
    {
        Console.WriteLine("Receiver execute "   commandName);
    }
}

// 调用者角色
public class Invoker
{
    private ICommand command;

    // 设置命令
    public void SetCommand(ICommand command)
    {
        this.command = command;
    }

    // 执行命令
    public void ExecuteCommand()
    {
        command.Execute();
    }
}

// 客户端测试
public class Client
{
    public static void Main()
    {
        Receiver receiver = new Receiver();
        ConcreteCommandA commandA = new ConcreteCommandA(receiver);
        ConcreteCommandB commandB = new ConcreteCommandB(receiver);

        Invoker invoker = new Invoker();

        invoker.SetCommand(commandA);
        invoker.ExecuteCommand();

        invoker.SetCommand(commandB);
        invoker.ExecuteCommand();
    }
}

【代码分析】

在上面的示例中,ICommand接口定义了命令执行的方法Execute()ConcreteCommandAConcreteCommandB是两个具体的命令类,它们继承或实现了ICommand接口,并实现了命令执行的具体操作。Receiver是接收者类,它负责实际执行命令操作。Invoker类是调用者类,它包含了一个ICommand接口类型的成员变量,可以接收不同的具体命令对象。当需要执行操作时,调用ExecuteCommand()方法,实现对命令的调用执行。

在客户端代码中,通过创建具体的命令对象并将其传递给调用者类,来执行不同的命令,实现了命令之间的解耦。

【小结】

日拱一卒,终有所获。

0 人点赞