`

CommandPattern

 
阅读更多

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

 

构成
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();
            }
        }
    }

 

  • 大小: 8.5 KB
  • 大小: 6.4 KB
  • 大小: 45.1 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics