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

       单一职责原则

        定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 

       里氏替换原则

        定义:所有引用基类的地方必须能透明地使用其子类的对象。

       依赖倒置原则

        定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。

       接口隔离原则

        定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 

       迪米特法则

        定义:一个对象应该对其他对象保持最少的了解。

       开闭原则

        定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

        所谓的命令模式,就是将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作

      

       打个比喻说,如果你去餐厅吃饭,点了一个红烧茄子,那么服务员就会记下你点了什么菜,但是又没有这个菜,和这个菜怎么做他是不知道的

        他只是一个消息的传递者

      

      首先创建一个用来执行命令的接口,这个接口会被相关的实现类所实现,毕竟这个是拿来用的0-0

        interface ICommand
        {
            void Exec();//执行命令
        }

       接着就什么一个具体执行,或者接受命令的人

        class ChuShi
        {
         public void ExecQieZhi()
            {
                System.Console.WriteLine("炒一个茄子0-0");
            }
        public void ExecTuDou()
            {
                System.Console.WriteLine("炒一个土豆0-0");
            }
        }

      知道由谁来执行上面定义接口的命令了,那么我们就需要创建相对应的命令了,因为上面的命令都还没有实现

        在这个类里面,只需要知道命令的执行者是谁就可以了,他只是用来传递消息的,毕竟,真正怎么做,还得厨师才知道

        class QieZhi:ICommand
        {
            ChuShi chushi;
            public QieZhi(ChuShi s)
            {
                this.chushi=s;
            }
             public void Exec()
            {
                chushi.ExecQieZhi();
            }
        }

      -------------------------在创建一个

        class TuDou:ICommand
        {
            ChuShi chushi;
            public TuDou(ChuShi s)
            {
                this.chushi=s;
            }
             public void Exec()
            {
                chushi.ExecTuDou();
            }
        }

      那么现在,命令也有了,执行者也有了,我们是不是就可以执行程序了呢?

        答案是肯定的

       但是这样做有一点不好,不可以重复的利用命令类,因为每次我们点了一个土豆就要实例化一个土豆,

         所以,我们有了一个服务员的类,

        class wariter
        {
            ICommand ic=null;//引用命令接口
            public wariter()
            {
    
            }
            public void DianCai(ICommand ic)//点菜
            {
                this.ic = ic;
            }
            public void exec()//通知厨师炒菜
            {
                if (ic!=null)
                {
                      this.ic.Exec();
                }
              
            }
        }

      所以现在点菜就变成这个样子了

       但是这样做,又有一个不好的地方,如果我要点十个茄子了 0-0,那我不就的让服务员跑10次去通知厨师炒菜?

        所以代码又变成了这样

      

      class wariter
        {
            List<ICommand> Icom = new List<ICommand>();
            //ICommand ic=null;
            public wariter()
            {
    
            }
            public void Add(ICommand ic)
            {
                this.Icom.Add(ic);
            }
            public void Remove(ICommand ic)
            {
                this.Icom.Remove(ic);
            }
            public void exec()
            {
                foreach (var item in Icom)
                {
                    item.Exec();
                }
            }
        }

      这样,客户就可以点菜和,撤菜了,

        执行效果如下

      

    Hold on, everything is possible.
  • 相关阅读:
    危险系数
    快速幂模板
    回文数字
    Echart图表使用
    http请求头中Referer的含义和作用
    有关程序员的时间管理
    数据库报错 java.sql.SQLException: The user specified as a definer ('root'@'%') does not exist
    sql中字符串替换
    前端获取数据库的datetime(时间戳) 转化成日期展示出来
    MySQL版本升级
  • 原文地址:https://www.cnblogs.com/student-note/p/6121799.html
Copyright © 2011-2022 走看看