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();
- }
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 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 ();
- }
- }
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)讲述命令模式与策略模式的联系:
首先就是封装的变化:
策略模式封装算法的变化;命令模式封装请求的变化。
都使用组合来实现功能,达到解耦的目的。
就难易而言:
当然策略模式相比之下比较简单了,设计模式第一个介绍的就是大名鼎鼎的策略模式,开启了自己的春季之旅。
精髓:
策略模式用一句话来表达即面向抽象编程,定义一组算法,把他们封装起来,并且使他们可以相互替换。该模式使算法可以独立于使用它的客户而变化;而命令模式将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
命令模式可以被抽象的视为一种策略模式,但是显然命令模式处理的是更为复杂的情况。