CommandPattern

xiaoxiao2026-01-02  6

意图:将一个请求封装为一个对象,从而使你可用不同个的请求对客户端进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作.

 

构成1.客户角色:创建一个具体命令对象,并确定其接收者.2.命令角色:声明一个给所有具体命令类的抽象接口.这是一个抽象角色,通常由一个接口或抽象类实现.

(Command角色会维护一个Receiver对象的一个引用,最终是调用Receiver来执行我们的动作)3.具体命令角色:定义一个接收者和行为之间的弱耦合,实现execute方法,负责调用接收者的相应操作.4.请求者角色:负责调用命令对象执行请求.

(Invoke角色维护着一个Command对象的引用,然后通过Command去完成相应的动作)5.接收者角色:负责具体实施和执行一个请求.

 

如上图:

顾客去饭店订餐,顾客向服务员发出了请求,那么真正去调用这个命令的人,其实是服务员而不是顾客,顾客只是去生成一个服务员对象而已,服务员再去调用这个命令也就是下单,但是命令本身它不会自己去执行,必须要有接收者来接收这个命令,最终去执行.那么上图中很明显服务员发出命令下单,最后命令是由厨师来执行的.厨师就是接收者,由它来真正完成我们相关的动作.这样的好处在于顾客不必和厨师(接收者)直接打交道,客户的要求最终是厨师来完成的,客户不需要知道到底是谁为它做的菜,这样的话就隔离了客户端与接收者,使得中间通过服务员以及这个命令将这个请求封装起来了,实际上点菜这个动作就是一个请求,换句话说就是一个命令,这个命令包装起来之后交给厨师进行处理.

 

ClassDiagram:

 

  SequenceDiagram:

 

class Client { static void Main(string[] args) { Receiver reciver = new Receiver(); Command command = new ConcreteCommand(reciver); Invoker invoker = new Invoker(); invoker.SetCommand(command); invoker.ExcuteCommand(); Console.ReadKey(); } /// <summary> /// 请求者 /// </summary> public class Invoker { Command command; public void SetCommand(Command command) { this.command = command; } public void ExcuteCommand() { command.Execute(); } } /// <summary> /// 接收者 /// </summary> public class Receiver { public void Action() { Console.WriteLine("Receiver Executed"); } } /// <summary> /// 命令角色 /// </summary> public abstract class Command { protected Receiver receiver; public Command(Receiver receiver) { this.receiver = receiver; } public abstract void Execute(); } /// <summary> /// 具体的命令角色 /// </summary> public class ConcreteCommand : Command { public ConcreteCommand(Receiver receiver) : base(receiver) { } public override void Execute() { receiver.Action(); } } }

 

转载请注明原文地址: https://www.6miu.com/read-5041952.html

最新回复(0)