大话设计模式-命令模式
命令模式
命令模式将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
对于请求排队或记录请求日志,以及支持可撤销的操作,行为请求者和行为实现者的紧耦合是不合适的。
命令模式的优点
命令模式能较容易地设计一个命令模式。在需要的情况下,可以较容易地将命令记入日志。
允许接受请求的一方决定是否要否决请求。可以很容易地实现对请求的撤销和重做。
由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。
命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开来。
命令模式结构演示
命令抽象
声明执行操作的接口。
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 ExcuteCommand() => command.Execute(); }
接收/执行者
知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者。
class Receiver { public void Action() => Console.WriteLine("执行请求"); }
测试结果
Receiver r = new Receiver(); Command c = new ConcreteCommand(r); Invoker i = new Invoker(); i.SetCommand(c); i.ExcuteCommand(); //测试结果 执行请求