博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
命令模式
阅读量:4918 次
发布时间:2019-06-11

本文共 3099 字,大约阅读时间需要 10 分钟。

前言

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

一、烤肉人

  

1     //烤肉者 2     public class Barbecuer 3     { 4         public void BakeMutton() 5         { 6             Console.WriteLine("烤羊肉串"); 7         } 8         public void BakeChickenWing() 9         {10             Console.WriteLine("烤鸡翅");11         }12     }

 

二、抽象命令

  

1     //抽象命令 2     public abstract class Command 3     { 4         protected Barbecuer receiver; 5         //确定烤肉串者 6         public Command(Barbecuer receiver) 7         { 8             this.receiver = receiver; 9         }10 11         public abstract void ExcuteCommand();12     }

 

三、具体的命令

  

1     //烤羊肉串命令 2     public class BakeMuttonCommand : Command 3     { 4         public BakeMuttonCommand(Barbecuer receiver) : base(receiver) 5         { 6         } 7  8         public override void ExcuteCommand() 9         {10             receiver.BakeMutton();11         }12     }
1     //烤鸡翅串命令 2     public class BakeChickenWingCommand : Command 3     { 4         public BakeChickenWingCommand(Barbecuer receiver) : base(receiver) 5         { 6         } 7  8         public override void ExcuteCommand() 9         {10             receiver.BakeChickenWing();11         }12     }

 

四、服务员类

  

//服务员类,不管用户想要什么烤肉,反正都是‘命令’,只管记录订单,    //然后通知‘烤肉者’执行即可    public class Waiter    {        private List orders = new List();        //设置订单        public void SetOrader(Command command)        {            if (command.ToString() == "_18.命令模式.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 (var i in orders)            {                i.ExcuteCommand();            }        }    }

 

五、客户端

  

1  class Program 2     { 3         static void Main(string[] args) 4         { 5             Barbecuer bb = new Barbecuer(); 6             Command c1 = new BakeMuttonCommand(bb); 7             Command c3 = new BakeMuttonCommand(bb); 8             Command c2 = new BakeChickenWingCommand(bb); 9             Waiter gg = new Waiter();10 11             gg.SetOrader(c1);12             gg.SetOrader(c2);13             gg.SetOrader(c3);14 15             //订单完毕,通知厨房16             gg.Notify();17             Console.WriteLine("-----------------------");18             gg.CancelOrder(c3);19             gg.Notify();20 21 22             Console.ReadKey();23 24         }25     }

 

  

总结

  1、他能较容易地设计一个命令队列

  2、在需要的情况下,可以较容易地将命令记入日志

  3、允许接收请求的一方决定是否取消请求

  4、可以容易地实现对请求的撤销和重做

  5、由于加进新的具体命令类不影响其他的类,因此增加新的额具体命令类很容易

  6、命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分隔开。

 

  参考书籍:大话设计模式

转载于:https://www.cnblogs.com/hyunbar/p/9982127.html

你可能感兴趣的文章
虚拟硬盘
查看>>
练习作品7:批量做字库 识别码
查看>>
1.nginx_add_after_body
查看>>
php 小点02
查看>>
DotNet平台和C#语言
查看>>
RTX客户端不能刷新组织架构
查看>>
文件复制三种方法
查看>>
TP框架对数据库的基本操作
查看>>
tuxedo组件安装不当导致的系统运行异常问题
查看>>
What is 0.0.0.0.0
查看>>
第三次作业
查看>>
在ubuntu上搭建开发环境5---联想Y470安装 ubuntu,解决双显卡发热等问题
查看>>
数据库_10_校对集问题
查看>>
三、绘图和可视化之matplotlib
查看>>
HDU 3605 Escape
查看>>
位域/字节对齐
查看>>
Topcoder SRM633 DIV2 解题报告
查看>>
如何使用Log4j?
查看>>
sql 递归显示所有父节点
查看>>
hdu_1558_Segment set(并查集+计算几何)
查看>>