首页 > 代码库 > 命令模式-重温策略
命令模式-重温策略
还记得一个多月前写的策略模式,自己出门旅行到底乘坐什么工具呢?这得由自己的想法以及路程来决定吧!不过要想旅行还是得有旅行资金才行,这就得涉及到自己暑假打工当服务员的经历了!服务员当然得服从客户的命令了!客人可都不是好惹的啊!说这么多,要是以前当然就是苦与乐的诉说了,但是现在这两个经历不正是自己学习的两种设计模式吗?
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)讲述命令模式与策略模式的联系:
首先就是封装的变化:
策略模式封装算法的变化;命令模式封装请求的变化。
都使用组合来实现功能,达到解耦的目的。
就难易而言:
当然策略模式相比之下比较简单了,设计模式第一个介绍的就是大名鼎鼎的策略模式,开启了自己的春季之旅。
精髓:
策略模式用一句话来表达即面向抽象编程,定义一组算法,把他们封装起来,并且使他们可以相互替换。该模式使算法可以独立于使用它的客户而变化;而命令模式将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
命令模式可以被抽象的视为一种策略模式,但是显然命令模式处理的是更为复杂的情况。
命令模式-重温策略