命令模式-重温策略
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 阅读(106) 评论(0) 编辑 收藏 举报