设计模式之---命令模式
命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
优点:
- 能够比较容易的设计一个命令队列
- 在需要的情况下,可以较容易的将命令计入日志
- 允许接收请求的一方决定是否要否决请求
- 可以容易的实现对请求的撤销和重做
- 新增新的具体命令很容易
- 命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。
敏捷开发原则:不要为代码添加基于猜测的,实际不需要的功能。如果不清楚一个系统是否需要命令模式,一般就不要急着去实现它,事实上,在需要的时候通过重构实现这个模式并不困难,只有在真正需要知道撤销/恢复操作等功能时,把原来的代码重构为命令模式才有意义。
Invoker:要求该命令执行这个请求
command:用来声明执行操作的接口
Receiver:知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。
concreteCommand:将一个接收者对象绑定于一个动作,调用接收者相应的操作,一实现Excute
Receiver r = new Receiver(); Command c = new ConcreteCommand(r); Invoker i = new Invoker(); i.SetCommand(c); i.ExcuteCommand();
abstract class Command { protected Receiver receiver; public Command(Receiver receiver) { this.receiver = receiver; } abstract public void Excute(); } class ConcreteCommand : Command { public ConcreteCommand(Receiver receiver):base(receiver) { } public override void Excute() { receiver.Action(); } } class Invoker { private Command command; public void SetCommand(Command command) { this.command = command; } public void ExcuteCommand() { command.Excute(); } } class Receiver { public void Action() { Console.WriteLine("执行请求"); } }