定义
将一个请求封装为一个对象,从而让你可以用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。
命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。
举例
如:开关与电灯、排气扇等无直接关系,可以用控制电灯,也可以用来控制排气扇等控制
结构
实现
//用来声明执行操作的接口。
abstract class Command
{
protected Receiver receiver;
public Command(Receiver receiver)
{
this.receiver = receiver;
}
abstract public void Execute();
}
//ConcreteCommand类,将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现Execute。
class ConcreteCommand : Command
{
public ConcreteCommand(Receiver receiver) : base(receiver)
{}
public override void Execute()
{
receiver.Action();
}
}
//要求该命令执行这个请求。
class Invoker
{
private Command command;
public void SetCommand(Command command)
{
this.command = command;
}
public void ExecuteCommand()
{
command.Execute();
}
}
//知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者。
class Receiver
{
public void Action()
{
Console.WriteLine("执行请求!");
}
}
class Program
{
static void Main(string[] args)
{
Receiver r = new Receiver();
Command c = new ConcreteCommand(r);
Invoker i = new Invoker();
i.SetCommand(c);
i.ExecuteCommand();
}
}
优点
- (1)命令模式降低了系统的耦合度。
- (2)通过使用命令模式,新的命令可以很容易地加入到系统中。
- (3)使用命令模式可以比较容易地设计一个命令队列或宏命令(组合命令)。
- (4)命令模式为请求的撤销(Undo)和恢复(Redo)操作提供了一种设计和实现方案。
优点
使用命令模式可能会导致某些系统有过多的具体命令类。
适用环境
- (1)系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
- (2)系统需要在不同的时间指定请求,将请求排队和执行请求。
- (3)系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
- (4)系统需要将一组操作组合在一起形成宏命令。