命令模式(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()
,ConcreteCommandA
和ConcreteCommandB
是两个具体的命令类,它们继承或实现了ICommand
接口,并实现了命令执行的具体操作。Receiver
是接收者类,它负责实际执行命令操作。Invoker
类是调用者类,它包含了一个ICommand
接口类型的成员变量,可以接收不同的具体命令对象。当需要执行操作时,调用ExecuteCommand()
方法,实现对命令的调用执行。
在客户端代码中,通过创建具体的命令对象并将其传递给调用者类,来执行不同的命令,实现了命令之间的解耦。
【小结】
日拱一卒,终有所获。