命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

命令看成是函数方法,而这函数方法在不同的业务含义中,其参数个数,参数的数据类型,返回值可能不统一。把用户可以触发的功能当成一个命令,把这个“命令”封装成一个对象。把对象抛给接收者,让接收者处理其中的命令。而这个接收者可以接收命令的抽象类。这样接收者就可以间接的统一处理 接口不统一的函数方法了

以添加商品到购物车,删除购物车中的商品,支付购物车的商品为例:

class ICommand{
public:virtual void execute() = 0;
};class Commodity{
public:string id;
};class ShoppingCart{
public:string cartid;List<Commodity> commodities;
};//原先添加商品,需要传两个参数 (Commodity,ShoppingCart),现在用对象封装在构造函数和execute中
class AddCommodityToCart :public ICommand{Commodity  commodity ;ShoppingCart shoppingCart ;
public:void AddCommodityToCart (Commodity c, ShoppingCart s):commodity(c),shoppingCart (s){}void execute() {shoppingCart.commodities.add(commodity );}
};//原先删除商品,需要传两个参数 (ShoppingCart,string ),现在用对象封装在构造函数和execute中
class RemoveCommodity :public ICommand{string commodityId;ShoppingCart shoppingCart ;
public:void RemoveCommodity (ShoppingCart s,string c):commodityId(c),shoppingCart (s){}void execute() {for(Commodity  commodity : shoppingCart.commodities){if(commodity.id == commodityId){shoppingCart.commodities.remove(commodity );}}}
};
//原先清空购物车,需要传一个参数 (ShoppingCart),现在用对象封装在构造函数和execute中
class PayCart :public ICommand{ShoppingCart shoppingCart ;
public:void PayCart (ShoppingCart s): shoppingCart (s){}void execute() {cout<<"购物车支付:";for(Commodity  commodity : shoppingCart.commodities){cout<<commodity.id <<"\t";}shoppingCart.commodities.clear();}
};//执行命令的类
class Receiver {
private :List <ICommand*> commands;
public:void addCommands(ICommand* c){commands.add(c);};void action(ICommand* c=nullptr){if(c !==nullptr)commands.add(c);for (int i =0 ;i<commands.size();i++){commands[i]->execute();}}
};

而调用起来也是很方便的

Receiver USER_;
ShoppingCart USERCART_;void executecommand(Icommand * c){USER.action(c);}
void mainProcess(){Commodity commodity1("book");Commodity commodity1("game");AddCommodityToCart addCommodityToCart(commodity1,USERCART_);RemoveCommodityToCart removeCommodityToCart(USERCART_,"book");PayCart paycart(USERCART_);USER_.addCommand(&addCommodityToCart);USER_.addCommand(&removeCommodityToCart);executecommand(&paycart) ; //输出 购物车支付game;
}

命令模式的实现,让Receiver 对象成功处理 参数类型不同,参数个数不同,返回值不同的多个方法。当然在现如今已有更方便的实现方式可以满足 “接收处理 格式不统一的函数” 。 例如 模板/泛型 ,重载括号运算符(函数对象)等方式实现。毕竟虚函数的运行时绑定(动态绑定)要比编译时绑定的性能要低些。

设计模式的理解:命令模式 (Command)相关推荐

  1. 【白话设计模式八】命令模式(Command)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  2. [设计模式-行为型]命令模式(Command)

    一句话 命令的请求和命令的执行用不同的对象表示.(好处是可以独立开发,也可以进行撤销) 概括 解析 COMMAND-俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有 ...

  3. C#面向对象设计模式14:命令模式(Command)

    命令模式,先占位,由于文章太耗时,后面补上. using System; using System.Collections.Generic; using System.Linq;namespace S ...

  4. 设计模式之略见一斑(命令模式Command)

    终于把构造模式的几种设计模式写完,接下来开始写的行为模式.说起Command我们就要想起菜单构造方法. 1.菜单命令: 我们常见的一种情况就是菜单命令,按钮监听.下面就举出一个常用的简单例子 : pu ...

  5. 入门案例理解 —— 命令模式(Command Pattern)

    目录 前言 一.命令模式[what] 二. 命令模式场景 三. 命令模式UML图 四.入门案例分析 ~ ~ (无使用命令模式) 五.传统设计方案 有哪些不足? 六.使用命令模式改造该项目 六.命令模式 ...

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

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

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

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

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

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

  9. c++命令模式command

    c++命令模式command 概念 角色和职责 案例 概念 Command模式也叫命令模式 ,是行为设计模式的一种.Command模式通过被称为 Command的类封装了对目标对象的调用行为以及调用参 ...

  10. Head First 设计模式中的命令模式 的一个错误

    最近在看Head First 设计模式,其中命令模式中有讲到实现撤销功能,并且作者还出了一道题, 下面的是书中习题: public class MarcoCommand implements Comm ...

最新文章

  1. OpenCV编程案例:使用轮廓函数检测连通区域
  2. [03] 处理注解:反射
  3. Weblogic 集群部署说明 --转
  4. gitlab 迁移、升级打怪之路:8.8.5-- 8.10.8 -- 8.17.8 -- 9.5.9 -- 10.1.4 -- 10.2.5
  5. VTK:图表之ScaleVertices
  6. GitHub Actions,卧槽!牛批!
  7. 对称加密算法-DES以及DESede算法
  8. 在raspbian上配置apache2/subversion/xdebug及mysql远程访问
  9. 使用spring框架时,使用xml还是注解
  10. DDL、DML、DQL、DCL 理解
  11. python知识点总结_20211231
  12. C# 三菱PLC上位机开发环境搭建
  13. Typescript的优缺点和面试题
  14. 华为交换机 查ip冲突_华为交换机发现邻居操作,查看端口和ip
  15. a标签href属性的用法
  16. 计算机中丢失XINPUT无法修复,xinput1_3.dll丢失怎么修复
  17. 交互设计师眼中的需求分析
  18. windows10多桌面创建 切换 和分屏
  19. html如何给盒子设置位置,CSS盒子定位
  20. Python编写程序计算如下的分段函数

热门文章

  1. RHEL6基础四十九之RHEL文件(夹)权限进阶篇
  2. 构造代码块会想你所想
  3. 《个体软件过程》—第1章1.1节什么是软件工程
  4. sigaction函数解析
  5. 再谈 查询长期未登录AD的用户
  6. VMware Converter 使用图解
  7. vs2005's addin folder
  8. sklearn模型预测性能评估(二)
  9. Deepin/Linux系统使用GUFW可视化管理、配置防火墙规则
  10. golang基本数据类型和string的相互转换