命令模式-重温策略

版权声明:本文为博主原创文章。未经博主同意不得转载。

https://blog.csdn.net/huo065000/article/details/24587949

        还记得一个多月前写的策略模式,自己出门旅行究竟乘坐什么工具呢?这得由自己的想法以及路程来决定吧!只是要想旅行还是得有旅行资金才行,这就得涉及到自己暑假打工当服务员的经历了!服务员当然得服从客户的命令了!

客人可都不是好惹的啊!

说这么多,要是曾经当然就是苦与乐的诉说了。可是如今这两个经历不正是自己学习的两种设计模式吗?

1)紧耦合设计

            小时候就梦想自己的老妈能够开个饭店,这样就能够实现自己的小小的梦想了-美味佳肴顿顿享受。可如今尽管梦想实现了,可是每天看着她忙来忙去,已经没有了吃零食的那种冲动,很多其它的是一种心痛。

    生活易如此。真的不想他每天都那么的忙碌。

为何就不能找个帮手呢?

2)松耦合设计

          也许这就是老一代的忙碌吧!假设是自己的话,就不想那么忙碌,如今的梦想就是能够开一个小小的咖啡店,找一个帮手来帮助自己,来满足自己调理制造咖啡的小小愿望。

结构图:


    可是当个店主也并不是是一件easy的事情,假设顾客突然想换一下咖啡,不想要拿铁了,又或者点的点心多了,想退一些等等,这些都得须要一些备份,方便结账。那么究竟什么是命令模式呢?

3)定义:

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

命令模式,作为一种行为模式,首先做到了低耦合,提高了灵活性。

4)咖啡馆代码:

client代码:

 static void Main(string[] args)
        {
            //开门之前准备
            Barista self = new Barista();
            Command Milk1 = new Milk(self);  //准备的牛奶咖啡
            Command Milk2 = new Milk(self);
            Command Latte1 = new Latte(self);  //准备的拿铁咖啡
            Waiter girl = new Waiter();

            //开门营业,顾客点餐
            girl.SetOrder(Milk1);
            girl.SetOrder(Milk2);
            girl.SetOrder(Latte1);

            //点餐完成,通知self
            girl.Notify();   //通知自己。然后进行调咖啡命令
            Console.Read();
        }
咖啡师,客户无需知道自己是谁。仅仅要服务员能够把他们所点餐的食品端上去就可

 public abstract class Command
        {
            protected Barista receiver;
            public Command (Barista receiver)
            {
                this .receiver =receiver ;
            }
            //运行命令
            abstract public void ExcuteCommand();
        }
对于服务员的任务就有点艰巨了,得时刻关注着每一位顾客。对于想要的食品有没有货源,想不想取消订单等等都得细致

public class Waiter
        {
            private IList<Command> orders = new List<Command>();  //添加存放详细命令的容器
            //设置订单
            public void SetOrder(Command command)
            {
                if (command.ToString() == "咖啡馆点餐.Coffee+Latte")  //在用户提出请求时,对没货的咖啡进行回绝
                {
                    Console.WriteLine("服务员:拿铁咖啡已售完");
                }
                else   //记录客户所点的咖啡的日志,以备算账收线
                {
                    orders.Add(command);
                    Console.WriteLine("添加订单:" + command.ToString() + " 时间:" + DateTime.Now.ToString());
                }
            }
            //取消订单
            public void CancelOrder(Command command)
            {
                orders .Remove (command );
                Console .WriteLine ("取消订单:" + command.ToString() + " 时间:" + DateTime.Now.ToString());
            }
            //通知所有运行
            public void Notify()
            {
                foreach (Command cmd in orders )
                {
                    cmd .ExcuteCommand ();
                }
            }
最后运行的结果:

旅游资金挣到手了,究竟该怎样旅游呢?两者究竟有什么关系呢?

5)讲述命令模式与策略模式的联系:

首先就是封装的变化:

  策略模式封装算法的变化;命令模式封装请求的变化。

  都使用组合来实现功能,达到解耦的目的。

就难易而言:

  当然策略模式相比之下比較简单了,设计模式第一个介绍的就是大名鼎鼎的策略模式,开启了自己的春季之旅。

精髓:

  策略模式用一句话来表达即面向抽象编程。定义一组算法,把他们封装起来,而且使他们能够相互替换。该模式使算法能够独立于使用它的客户而变化。而命令模式将一个请求封装为一个对象。从而使你能够用不同的请求对客户进行參数化。对请求排队或者记录请求日志。以及支持可撤销的操作。

  命令模式能够被抽象的视为一种策略模式。可是显然命令模式处理的是更为复杂的情况。




posted on 2019-05-14 13:55  xfgnongmin  阅读(104)  评论(0编辑  收藏  举报

导航