命名模式, 将一个请求封装为一个对象, 从而使你可用不同的请求对客户进行参数化; 对请求排队或记录请求日志, 以及支持可撤销的操作.
abstract class Command {
protected Receiver receiver;
public Command(Receiver receiver) {
this.receiver = receiver;
}
abstract public void 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 {
// todo
}
}
public static void Main(string[] agrs) {
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker();
invoker.SetCommand(command);
invoker.ExecuteCommand();
}敏捷开发原则告诉我们, 不要为代码添加基于猜测的, 实际不需要的功能. 如果不清楚一个系统是否需要命令模式, 一般就不要着急去实现他, 事实上, 在需要的时候通过重构实现这个模式并不困难, 只有在真正需要如撤销/恢复操作等功能时, 把原来的代码重构为命令模式才有意义.