设计模式---命令模式
来源:互联网 发布:苹果mac xshell 编辑:程序博客网 时间:2024/06/16 13:37
命令模式:
命令模式 (Command),将一个请求封装为一个对象,从而是你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
结构图
Invoker类 ,要求该命令执行这个请求
Command类,用来声明执行操作的接口
ConcreteCommand类,将一个接受者对象绑定于一个动作,调用接受者相应的操作,以实现Execute。
Receiver类,知道如何实施与执行一个请求相关的操作,任何类都可能作为一个接收者。
作用:
- 优点
- 优点
1,能够溶胶地设计一个命令队列。
2,在需要的情况下,可以较容易地将命令记入日志。
3,允许接受请求的一方决定是否要否决请求。
- 何时使用?
如果不清楚一个系统是否需要命令模式,一般情况下不要着急去实现它,事实上,在需要的时候通过重构实现这个模式并不困难,只有在真正需要如撤销/回复操作等功能呢时, 把原来的代码重构为命令模式才有意义。
实例
举例说明---吃烤羊肉串
烧烤摊 VS 烧烤店
在烧烤摊上,因为要吃烤肉的人田铎,而且每个人都希望最快迟到肉串,而烤肉的老板只有一个人,来的人一多 ,就未必记得住谁交过钱,谁要多少串,需不需要辣椒等等,容易造成混乱
而在烧烤店中如果需要对这些混乱做记录,而且在店中,我们不需要认识烤肉的是谁,只需要给接待的服务员说我们要什么就好,让他给我们的请求做记录,然后再由他通知烤肉师傅,,所有的客户都有一份订单,烤肉师傅可以按先后顺序操作,不会混乱也不会遗忘,收钱的时候也不会多收少收,如果点多了可以撤销,直接让服务员划掉就好了。
这就是让变成融入生活
class Program { static void Main(string[] args) { //开店前的准备 Barbecuer boy = new Barbecuer(); Command bakeMuttonCommand1 = new BakeMuttonCommand(boy); Command bakeMuttonCommand2 = new BakeMuttonCommand(boy); Command bakeChickenWingCommand1=new BakeChickenWingCommand (boy); Waiter girl1 = new Waiter(); //开门营业 顾客点菜 girl1.SetOrder(bakeMuttonCommand1 ); girl1 .SetOrder (bakeMuttonCommand2 ); girl1.SetOrder(bakeChickenWingCommand1 ); //点菜完毕,通知厨房 girl1.Notify(); Console.Read(); } } //抽象命令类 public abstract class Command { protected Barbecuer receiver; //抽象命令类,只需确定烤肉串者是谁 public Command(Barbecuer receiver) { this.receiver = receiver; } //执行命令 abstract public void ExcuteCommand(); } //烤肉串的实现 public class Barbecuer { //烤羊肉 public void BakeMutton() { Console.WriteLine("烤羊肉串!"); } //烤鸡翅 public void BackChickenWing() { Console.WriteLine("烤鸡翅!"); } } //具体命令类 //烤肉串命令 class BakeMuttonCommand : Command { public BakeMuttonCommand(Barbecuer receiver) : base(receiver) { } public override void ExcuteCommand()//具体命令类,执行命令时,执行具体的行为 { receiver.BakeMutton(); } } //烤鸡翅命令 class BakeChickenWingCommand : Command { public BakeChickenWingCommand(Barbecuer receiver) : base(receiver ) { } public override void ExcuteCommand() { receiver.BackChickenWing(); } } //服务员类 //服务员 public class Waiter { private IList <Command >orders=new List <Command >();//增加存放具体命令的容器 //设置订单 public void SetOrder(Command command) { //在客户提出请求时,对没货的烧烤进行回绝 if (command .ToString ()=="命令模式.BakeChickenWingCommand") { 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(); } } }
1 0
- 设计模式---命令模式
- 设计模式-命令模式
- 设计模式:命令模式
- 设计模式:命令模式
- 设计模式:命令模式
- 设计模式 命令模式
- 设计模式--命令模式
- 设计模式---命令模式
- 设计模式- 命令模式
- 设计模式---命令模式
- 设计模式 - 命令模式
- 【设计模式】【命令模式】
- 设计模式---命令模式
- 设计模式 - 命令模式
- 设计模式:命令模式
- 设计模式 - 命令模式
- 设计模式-命令模式
- 设计模式---命令模式
- 对数据挖掘clementine软件里面一般性的节点作用描述一下
- LeetCode刷题之第一题——Add Two Numbers
- [BZOJ2756][SCOI2012]奇怪的游戏
- 求a的回文数:12345变成54321
- 权限分析
- 设计模式---命令模式
- USACO-Section 3.2 Stringsobits(DP)
- C++调用JAVA方法详解
- Java反射机制:从对象获取类的所有方法信息
- 动态规划
- maven+springmvc错误 JAX-RS (REST Web Services) 2.0 can not be installed
- Atitit.研发管理---api版本号策略与版本控制
- 不使用临时变量 交换两个数
- php分配变量 smarty