文章目录

  • 1.概述
  • 2.命令模式简单实现
  • 3.命令模式的应用场景和优缺点
  • 4.小结
  • 参考文献

1.概述

使用设计模式可以提高代码的可复用性、可扩充性和可维护性。命令模式(Command Pattern)属行为型,将请求封装成对象,以便使用不同的请求、请求日志或请求队列等来参数化其他对象。命令模式也支持撤销操作。

通俗来讲,通过增加一个命令对象,放在请求者与请求的接收者之间,来达到二者的解耦合。一个请求对应一个命令对象,命令对象将请求的接收者和完成请求的基本操作封装在一起,对外提供 execute() 方法。完成请求的基本操作由接收者提供,在 execute() 方法中被调来完成请求,请求者如果调用 execute(),请求的目的就能达到,而不需要直接与请求的接收者交互,降低了耦合度。

类图结构如下:

Client类:最终的客户端调用类。
Invoker类:调用者,调用具体命令类提供的execute()方法来完成请求。
Command类:是一个抽象类,一般需要对外公布一个execute()方法来完成请求。
ConcreteCommand类:Command类的实现类,对抽象类中声明的execute()方法进行实现。
Receiver类:接收者,动作的执行者,对外提供基本操作,交由ConcreteCommand类调用,来完成Invoker类的请求。

2.命令模式简单实现

举一个生活的例子,去餐厅吃饭的流程一般是这样的,服务员叫消费者点餐,下单生成订单,订单送往厨房交由厨师烹饪。四个角色,消费者对应Client类,服务员对应Invoker类,订单对应ConcreteCommand类,厨师对应Receiver类。服务员通过订单,无需自己完成食物的烹饪,而是交由厨师来完成,所以服务员是烹饪食物该动作的请求者,订单充当命令的角色,厨师是完成食物烹饪的动作执行者。所以上面的点餐过程可以通过命令模式来实现。

动作执行者厨师类:

class Chef {public:void cook() const{cout << "开始烹饪"<< endl;}
};

充当命令角色的订单类:

//抽象命令类
class Command{public:virtual void execute() const = 0;
};//订单类
class OrderCommand:public Command{private:const Chef& chef;
public:OrderCommand(const Chef& chef):chef(chef){}virtual void execute() const{chef.cook();}
};

烹饪动作请求者服务员类:

class Attendant {private:const OrderCommand& orderCommand;
public:Attendant(const OrderCommand& orderCommand):orderCommand(orderCommand){}void cook() {orderCommand.execute();}
};

客户端代码,消费者进入餐厅后开始点餐:

int main() {//开始下单Chef chef;OrderCommand orderCommand(chef);Attendant attendant(orderCommand);//请求烹饪attendant.cook();
}

运行结果:

开始烹饪

3.命令模式的应用场景和优缺点

应用场景:
对于大多数请求-响应模式的功能,比较适合使用命令模式,正如命令模式定义说的那样,命令模式对实现记录日志、撤销操作等功能比较方便。

优点:
(1)命令模式有效地将发出请求的对象和执行请求的对象解耦。
(2)命令模式的封装性好。每个命令都被封装起来,对于客户端来说,需要什么功能就去调用相应的命令,而无需知道命令具体是怎么执行的。
(3)命令模式的扩展性好。在命令模式中,接收者类对外提供基本操作,命令类对这些基本的操作进行封装,当增加新命令的时候,包装所需的接收者类对外提供的操作即可,代码的复用性好。比如,文件操作中,我们需要增加一个剪切命令,则只需要把复制文件和删除文件这两个命令组合一下就行了,非常方便。

缺点:
如果请求很多,使用命令模式,每一条请求都需要封装成一个命令类,会造成类数量膨胀。

4.小结

(1)命令模式属行为型,将请求封装成对象,以便使用不同的请求、请求日志或请求队列等来参数化其他对象。命令模式也支持撤销操作。
(2)请求日志指的是将所有的请求记录在日志中,一旦系统死机,我们可以对请求(命令对象)重新加载,成批地依次调用这些命令对象的execute()方法。
(3)请求队列指将请求形成队列,依次从队列中取出命令对象,调用它的execute()方法完成请求。

“使用不同的请求、请求日志或请求队列等来参数化其他对象”意味可以将命令对象、记录在日志文件中的命令对象列表和命令对象构成的队列当成参数来使用,传递给其他类对象。


参考文献

[1] Head First 设计模式(中文版).P193-230

行为型设计模式(3)—— 命令模式(Command Pattern)相关推荐

  1. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  2. 设计模式:命令模式(Command Pattern)

    命令模式(Command Pattern): 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道请求的操作是哪个. 我们只需在程序运行时指定具体的请求接受者即可,此时 ...

  3. 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释

    命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...

  4. 设计模式系列3-----C++实现命令模式(Command Pattern)

    什么是命令模式? GoF的书的定义为:"Command pattern encapsulate request as an object, thereby letting you param ...

  5. 解读设计模式----命令模式(Command Pattern)

    ***本文与作者原文有一定的偏差,其中加入了一部分是个人看法,详细请查看作者原文.*** 原文连接http://www.dofactory.com/Patterns/PatternCommand.as ...

  6. 设计模式之命令模式(Command)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  7. 行为型设计模式(八)命令模式【王者荣耀的服务端实现】

    目录 一.概念及原理 二.具体实例 2.1 游戏开发背景知识 2.2 线程内轮询接收请求和处理请求实现 三.命令模式 VS 策略模式 四.小结 五.参考链接 一.概念及原理 命令模式的英文翻译是 Co ...

  8. 32命令模式(Command Pattern)

    耦合与变化:     耦合是软件不能抵御变化灾难的根本性原因.不仅实体对象与实体对象之间存在耦合关系,实体对象与行为操作之间也存在耦合关系.                               ...

  9. 设计模式 笔记 命令模式 Command

    //---------------------------15/04/25---------------------------- //Conmmand  命令模式----对象行为型模式 /* 1:意 ...

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

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

最新文章

  1. 超高损人技巧~~不可不看
  2. location.href使用方法总结
  3. ipconfig不是内部或外部_晶振有什么作用,如何选择合适的晶振,为什么有时候用内部晶振?...
  4. Try Git 译文
  5. java实验报告实验思路_20145307第一周JAVA实验报告
  6. JS字符串转为数值方法详解
  7. Windows 桌面运维 快捷键 基本配置
  8. 华为服务器怎么设置u盘启动安装系统,服务器怎么设置u盘启动
  9. bootstrap框架中的分割线
  10. 图片像素转换工具(pixelmash 2020) v2020.1.0
  11. python成绩分析器_Python-根据成绩分析是否继续深造
  12. 2017总结与2018规划
  13. Is the influences futural AI bring to software engineers are that scary?
  14. 梯度下降—Python实现
  15. 任务8、打印杨辉三角形
  16. WaitForSingleObject 返回值为 WAIT_ABANDONED 的情况
  17. 手握国企offer,33岁程序员不按常理出牌,网友炸了!
  18. dpdk 网络协议栈 vpp OvS DDos SDN NFV 虚拟化 高性能专家之路
  19. 朝韩危机-Python模拟导弹互射
  20. java语言中的while、do while、for循环

热门文章

  1. 因未交赎金,世界航天巨头机密文档遭勒索软件公开
  2. node 单个表加条件查询
  3. 【原/转】UITableview性能优化总结
  4. ArcGIS API for Silverlight开发入门(2):一个基础地图实例
  5. C/C++里面的左移和右移
  6. Juniper防火墙新手教程8:Juniper防火墙配置的导入及导出
  7. 关于超过255台电脑的内网IP规划问题
  8. Clucene实现中文分词搜索(转载)
  9. PyPDF2.utils.PdfReadError: Unexpected destination '/__WKANCHOR_2'
  10. python 根据网址获取股票