zoukankan      html  css  js  c++  java
  • 命令模式

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

    优势:

    第一,能较容易地设计一个命令队列

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

    第三,允许接受请求的一方决定是否要否决请求

    第四,可以容易的实现对请求的撤销和重做

    第五,由于加进行的具体命令类不影响其他的类,因此增加新的具体命令很容易

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

    在这类情况下需要用到命令模式,命令模式基本实现

      1 class Program
      2     {
      3         static void Main(string[] args)
      4         {
      5             //开店前的准备
      6             Barbecuer boy = new Barbecuer();
      7             Command bakeMuttonCommand1 = new BakeMuttonCommand(boy);
      8             Command bakeMuttonCommand2 = new BakeMuttonCommand(boy);
      9             Command bakeChickenWingCommand1 = new BakeChickenWingCommand(boy);
     10             Waiter girl = new Waiter();
     11 
     12             //开门营业 顾客点菜
     13             girl.SetOrder(bakeMuttonCommand1);
     14             girl.SetOrder(bakeMuttonCommand2);
     15             girl.SetOrder(bakeChickenWingCommand1);
     16 
     17             //点菜完闭,通知厨房
     18             girl.Notify();
     19 
     20             Console.Read();
     21 
     22         }
     23     }
     24 
     25     //服务员
     26     public class Waiter
     27     {
     28         private IList<Command> orders = new List<Command>();
     29 
     30         //设置订单
     31         public void SetOrder(Command command)
     32         {
     33             if (command.ToString() == "命令模式.BakeChickenWingCommand")
     34             {
     35                 Console.WriteLine("服务员:鸡翅没有了,请点别的烧烤。");
     36             }
     37             else
     38             {
     39                 orders.Add(command);
     40                 Console.WriteLine("增加订单:" + command.ToString() + "  时间:" + DateTime.Now.ToString());
     41             }
     42         }
     43 
     44         //取消订单
     45         public void CancelOrder(Command command)
     46         {
     47             orders.Remove(command);
     48             Console.WriteLine("取消订单:" + command.ToString() + "  时间:" + DateTime.Now.ToString());
     49         }
     50 
     51         //通知全部执行
     52         public void Notify()
     53         {
     54             foreach (Command cmd in orders)
     55             {
     56                 cmd.ExcuteCommand();
     57             }
     58         }
     59     }
     60 
     61     //抽象命令
     62     public abstract class Command
     63     {
     64         protected Barbecuer receiver;
     65 
     66         public Command(Barbecuer receiver)
     67         {
     68             this.receiver = receiver;
     69         }
     70 
     71         //执行命令
     72         abstract public void ExcuteCommand();
     73     }
     74 
     75     //烤羊肉串命令
     76     class BakeMuttonCommand : Command
     77     {
     78         public BakeMuttonCommand(Barbecuer receiver)
     79             : base(receiver)
     80         { }
     81 
     82         public override void ExcuteCommand()
     83         {
     84             receiver.BakeMutton();
     85         }
     86     }
     87 
     88     //烤鸡翅命令
     89     class BakeChickenWingCommand : Command
     90     {
     91         public BakeChickenWingCommand(Barbecuer receiver)
     92             : base(receiver)
     93         { }
     94 
     95         public override void ExcuteCommand()
     96         {
     97             receiver.BakeChickenWing();
     98         }
     99     }
    100 
    101     //烤肉串者
    102     public class Barbecuer
    103     {
    104         public void BakeMutton()
    105         {
    106             Console.WriteLine("烤羊肉串!");
    107         }
    108 
    109         public void BakeChickenWing()
    110         {
    111             Console.WriteLine("烤鸡翅!");
    112         }
    113     }
  • 相关阅读:
    【高并发】面试官问我:为什么局部变量是线程安全的?
    Java中的String到底占用多大的内存空间?你所了解的可能都是错误的!!
    【高并发】学好并发编程,关键是要理解这三个核心问题
    【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁!!
    12张图带你彻底理解分布式事务产生的场景和解决方案!!
    【高并发】面试官:讲讲高并发场景下如何优化加锁方式?
    【高并发】秒杀系统架构解密,不是所有的秒杀都是秒杀(升级版)!!
    十一长假我肝了这本超硬核PDF,现决定开源!!
    一文搞懂PV、UV、VV、IP及其关系与计算
    我把这个贼好用的Excel导出工具开源了!!
  • 原文地址:https://www.cnblogs.com/raohuagang/p/4004329.html
Copyright © 2011-2022 走看看