zoukankan      html  css  js  c++  java
  • 命令模式

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

            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);
         } }

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

  • 相关阅读:
    并查集图冲突hdu1272
    CentOS 7通过yum安装fcitx五笔输入法
    近期的技术问题让云供应商进行预设加密
    POJ 1166 The Clocks (暴搜)
    windows中的mysql修改管理员密码
    Visio画UML类图、序列图 for Java
    js中的时间与毫秒数互相转换
    java.lang.OutOfMemoryError: unable to create new native thread 居然是MQ问题
    WEB移动应用框架构想(转载)
    Android SDK安装教程
  • 原文地址:https://www.cnblogs.com/vichin/p/11761973.html
Copyright © 2011-2022 走看看