命令模式的定义是:
把请求封装成对象,从而用不同的请求来参数化客户端,队列化或日志化请求,并支持命令的撤消。
其UML类图的示例如下:
在这个模式中,参与者包括:
- Command,声明一个接口用于执行操作。
- ConcreteCommand:
- 定义一个Receiver和一个action之间的绑定。
- 通过在Receiver上调用相应的操作实现Execute。
- Client:创建一个ConcreteCommand对象,把它设置成receiver。
- Invoker:让command完成请求。
- Receiver:知道如何执行完成请求相关的操作。
实现代码:
public class Client
{
public void RunCommand()
{
Invoker invoker = new Invoker();
Receiver receiver = new Receiver();
ConcreteCommand command = new ConcreteCommand(receiver);
command.Parameter = "Dot Net Tricks !!";
invoker.Command = command;
invoker.ExecuteCommand();
}
}
public class Receiver
{
public void Action(string message)
{
Console.WriteLine("Action called with message: {0}", message);
}
}
public class Invoker
{
public ICommand Command { get; set; }
public void ExecuteCommand()
{
Command.Execute();
}
}
public interface ICommand
{
void Execute();
}
public class ConcreteCommand : ICommand
{
protected Receiver _receiver;
public string Parameter { get; set; }
public ConcreteCommand(Receiver receiver)
{
_receiver = receiver;
}
public void Execute()
{
_receiver.Action(Parameter);
}
}
使用场景:
- 需要实现callback功能。
- 需要支持redo和undo功能。
- 以不同的方式发送请求给可以处理的不同的接收者。
- 需要验证及记录所有命令。