命令模式(Command)定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。
  例如去饭馆吃饭,菜单不是等到客人来了之后才定制的,而是已经预先配置好的。这样,客人来了就只需要点菜,而不是任由客人临时定制。餐厅提供的菜单就相当于把请求和处理进行了解耦,这就是命令模式的体现。

  使用场景

  • 方法的请求者”与“方法的实现者”之间存在紧密的耦合关系时

  优点

  • 通过引入中间件(抽象接口)降低系统的耦合度。
  • 扩展性良好,增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,且满足“开闭原则”。
  • 可以实现宏命令。命令模式可以与组合模式结合,将多个命令装配成一个组合命令,即宏命令。
  • 方便实现 Undo 和 Redo 操作。命令模式可以与后面介绍的备忘录模式结合,实现命令的撤销与恢复。
  • 可以在现有命令的基础上,增加额外功能。比如日志记录,结合装饰器模式会更加灵活。

  缺点

  • 可能产生大量具体的命令类。因为每一个具体操作都需要设计一个具体命令类,这会增加系统的复杂性。
  • 命令模式的结果其实就是接收方的执行结果,但是为了以命令的形式进行架构、解耦请求与实现,引入了额外类型结构(引入了请求方与抽象命令接口),增加了理解上的困难。不过这也是设计模式的通病,抽象必然会额外增加类的数量,代码抽离肯定比代码聚合更加难理解。

      代码背景:去吃烧烤时,往往是客户向服务员一次性点完想吃的菜品,服务员记录完毕后再向厨师下单,服务员就起了分割请求和执行的作用。


命令类:

    //抽象命令abstract class Command{protected Barbecuer receiver;public Command (Barbecuer receiver)//只需要确定烤肉串的人是谁{this.receiver = receiver;}//执行命令abstract public void ExcuteCommand();}//烤羊肉串命令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.BakeChickenWing();}}

服务员类:

    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();}}}

厨师类:

    class Barbecuer{//烤羊肉串public void BakeMutton(){Console.WriteLine("烤羊肉串!");}//烤鸡翅public void BakeChickenWing(){Console.WriteLine("烤鸡翅!");}}

客户端:

        static void Main(string[] args){//开店前的准备Barbecuer boy = new Barbecuer();//烤串的人是boyCommand bakeMuttonCommand1 = new BakeMuttonCommand(boy);//烤羊肉串命令Command bakeMuttonCommand2 = new BakeMuttonCommand(boy);//烤羊肉串命令Command bakeChickenWingCommand1 = new BakeChickenWingCommand(boy);//烤鸡翅命令Waiter girl = new Waiter();//服务员是girl//开门营业girl.SetOrder(bakeMuttonCommand1);//把烤羊肉串放入订单//执行通知girl.SetOrder(bakeMuttonCommand2 );girl.SetOrder(bakeChickenWingCommand1 );girl.Notify();//下单完毕一起通知Console.Read();}

命令模式——经营烧烤摊相关推荐

  1. 大话设计模式之爱你一万年:第十四章 行为模式:命令模式:烧烤天天吃:2.命令模式概念

    通过上面的例子,我相信大家对于命令模式有了一定的了解,这一节我们把一些概念梳理一下. 一.命名模式(Command)基本概念 1.1 定义 命令(Command)模式:将请求封装成对象,以便使用不同的 ...

  2. 命令模式---烧烤点单

    有一个烧烤城,有两个摊位,一个摊位是烤鱼的,另外一个摊位可以烤肉串,也可以烤鸡翅.顾客不直接去摊位点食物,而是告诉服务员想吃什么,服务员去摊位下单并把烤好的食物拿给顾客.请用命令模式模拟这个过程. C ...

  3. 吃烧烤之命令模式学习笔记[C++版]

    #pragma once /******************************** * * 命令模式应用:烤羊肉串二 * ********************************/ ...

  4. 吃烧烤之命令模式学习笔记[C++版] 1

    /************************************************************************ * 命令模式学习笔记[C++] * Author: ...

  5. 设计模式之命令模式、举例分析、通俗易懂

    1. 定义 命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作 简单来说,就是类似于消费者-服务员-厨师,消费 ...

  6. 设计模式——命令模式(Command Pattern)

    比如去路边的烧烤摊,没有服务员.那么顾客和老板直接交互,一个是行为请求者,一个是行为实现者,二者紧耦合.但某些场合,比如需要对行为进行记录.撤销或重做.事务等处理时,这种无法抵御变化的紧耦合的设计就不 ...

  7. C++设计模式 命令模式(服务员命令厨师)

    文章目录 1. 基础知识 2. 逻辑代码 3. 应用 3.1 服务员命令厨师上菜 1. 基础知识 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式 ...

  8. 行为型设计模式之命令模式

    命令模式描述 官方解释 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作. 个人理解 将软件代码划分为三个方面:① 调用者(入口).② ...

  9. 码农小汪-设计模式之-命令模式

    大话设计模式的例子讲的非常的好,理解起来也方便!有时候忘了.想到这些特殊的例子感觉就是特别爽. 烤羊肉串带来的思考! 路边摊羊肉串: 老板,我这里排的比较先啊,我最先给钱.老板这个没有熟啊.我的是 辣 ...

最新文章

  1. 获得服务器硬件信息(CPUID、硬盘号、主板序列号、IP地址等)
  2. SAP Netweaver 7.4 SR2 Application Java Installation
  3. [学习笔记]信号与系统
  4. MongoDB数据库安装与连接
  5. 【NLP】Sentence-T5|谷歌提出文本表示新SOTA
  6. 苹果Xcode帮助文档阅读指南
  7. django crm 03
  8. mac apache服务器
  9. html box 竖线,CSS3 小竖条脉冲型LOADING动效
  10. 关于$.ajax的请求格式
  11. php分享十七:http状态码
  12. python纵向输出字符串,python-字符串方法,格式化输出
  13. html 防网页假死,htmlweb开发:防止浏览器假死的方法.doc
  14. python计算一个三位数个位数之和
  15. matlab画入射系数和透射系数,反射系数和透射系数.ppt
  16. 计算机系统故障如何处理,安装操作系统出错怎么办?几种常见的异常处理方法介绍(图文)...
  17. 重装系统——Win10/win11
  18. 五种方法安装Windows 7 64位系统
  19. 自然语言处理某个pipeline
  20. jsp牛刀小试之在线报名系统

热门文章

  1. Java除法结果带小数、进一法的实现
  2. MFC Windows 程序设计[218]之网络打印机(附源码)
  3. python分组统计数据_数据分组统计
  4. 学会后不用担心不会剪辑了,手把手教你视频剪辑,不用真人露脸
  5. 深度学习的主要应用举例
  6. 黑马程序员:Socket编程之(UDP vs TCP)
  7. 外卖派单模拟系统C语言代码,GitHub - Sndav/SuperDeliver: 外卖派单模拟系统大作业
  8. c语言花卉销售与管理系统,花卉销售与管理系统
  9. layui tree 对节点进行搜索
  10. 【经典题】跟着凡人玩转C语言之快速排序算法