• 命令模式


    在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪一个,我们只需在程序运行时
    指定具体的接收者即可,此时可以使用命令模式,来进行设计。
    命令模式使得请求发送者与请求者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。
    在命令模式中,会将一个请求封装成一个对象,以便使用不同参数来表示,不同的请求,同时命令模式也支持可撤销的操作。

            static void Main(string[] args)
            {
                Receiver r = new Receiver();
                Command c = new ConcreteCommand(r);
                Invoker i = new Invoker();
                i.SetCommand(c);
                i.ExecuteCommand();
            }
    
        //用来声明执行操作的接口
        abstract class Command
        {
            protected Receiver _receiver;
            public Command(Receiver receiver)
            {
                _receiver = receiver;
            }
            abstract public void Execute();
            abstract public  void Undo();
        }
    
        //将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现execute
        class ConcreteCommand : Command
        {
            public ConcreteCommand(Receiver receiver)
                : base(receiver)
            {
                
            }
            public override void Execute()
            {
            }
            public override void Undo()
            {
            }
        }
    
        public class Receiver
        {
            public void Action()
            {
                Console.WriteLine("执行请求!");
            }
        }
    
        //Invoker要求该命令执行这个请求。
        class Invoker
        {
         //List<Command> cmds=new List<Command>(); Command _command;//如果有多个请求,这里可以写成一个队列,然后当有新的请求进来的时候,可以将新的请求add到这个队列当中。
    public void SetCommand(Command command) { _command = command; } public void ExecuteCommand() { _command.Execute();
          //Foreach(var item in Cmds){item.Execute()} }
         public void UndoCommand(Command cmd){
           //cmds.Remove(cmd);
         } }

    敏捷开发的原则告诉我们:不要为代码添加基于猜测的、实际不需要的功能。如果不清楚一个系统是否需要用到命令模式,一般就不要去急着实现他,事实上,在需要的时候通过重构实现这个模式并不苦难。只有真正需要如 撤销/恢复操作等功能时,把原来的代码重构为命令模式才有意义。

  • 相关阅读:
    hdu 4339 Query 一道挺好的树状数组题(树状数组+二分思想)
    hdu 1133 Buy the Ticket(递推+精度精算)
    hdu 1267 下沙的沙子有几粒?(二维递推题)
    hdu 3397 Sequence operation(线段树的延迟标记)
    hdu 1258(dfs)
    hdu 3911 Black And White(线段树的延迟标记法)
    hdu 4148 Length of S(n) (坑爹的规律题)
    hdu 1016(一道经典的dfs)
    如何建立一棵哈夫曼树并且输出压缩码
    Codeforces Round #588 (Div. 2) E. Kamil and Making a Stream(DFS)
  • 原文地址:https://www.cnblogs.com/vichin/p/11761973.html
Copyright © 2020-2023  润新知