首页 > 代码库 > 命令模式-重温策略

命令模式-重温策略

        还记得一个多月前写的策略模式,自己出门旅行到底乘坐什么工具呢?这得由自己的想法以及路程来决定吧!不过要想旅行还是得有旅行资金才行,这就得涉及到自己暑假打工当服务员的经历了!服务员当然得服从客户的命令了!客人可都不是好惹的啊!说这么多,要是以前当然就是苦与乐的诉说了,但是现在这两个经历不正是自己学习的两种设计模式吗?

1)紧耦合设计

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

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

为何就不能找个帮手呢?

2)松耦合设计

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

结构图:


    但是当个店主也并非是一件容易的事情,如果顾客突然想换一下咖啡,不想要拿铁了,又或者点的点心多了,想退一些等等,这些都得需要一些备份,方便结账。那么到底什么是命令模式呢?

3)定义:

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

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

4)咖啡馆代码:

客户端代码:

 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)讲述命令模式与策略模式的联系:

首先就是封装的变化:

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

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

就难易而言:

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

精髓:

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

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




命令模式-重温策略