命令模式

   单一职责原则

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

   里氏替换原则

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

   依赖倒置原则

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

   接口隔离原则

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

   迪米特法则

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

   开闭原则

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

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

  

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

    他只是一个消息的传递者

  

  首先创建一个用来执行命令的接口,这个接口会被相关的实现类所实现,毕竟这个是拿来用的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.
原文地址:https://www.cnblogs.com/student-note/p/6121799.html