设计模式的理解:命令模式 (Command)
命令模式(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)相关推荐
- 【白话设计模式八】命令模式(Command)
为什么80%的码农都做不了架构师?>>> #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...
- [设计模式-行为型]命令模式(Command)
一句话 命令的请求和命令的执行用不同的对象表示.(好处是可以独立开发,也可以进行撤销) 概括 解析 COMMAND-俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有 ...
- C#面向对象设计模式14:命令模式(Command)
命令模式,先占位,由于文章太耗时,后面补上. using System; using System.Collections.Generic; using System.Linq;namespace S ...
- 设计模式之略见一斑(命令模式Command)
终于把构造模式的几种设计模式写完,接下来开始写的行为模式.说起Command我们就要想起菜单构造方法. 1.菜单命令: 我们常见的一种情况就是菜单命令,按钮监听.下面就举出一个常用的简单例子 : pu ...
- 入门案例理解 —— 命令模式(Command Pattern)
目录 前言 一.命令模式[what] 二. 命令模式场景 三. 命令模式UML图 四.入门案例分析 ~ ~ (无使用命令模式) 五.传统设计方案 有哪些不足? 六.使用命令模式改造该项目 六.命令模式 ...
- 设计模式:命令模式(Command Pattern)
命令模式(Command Pattern): 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道请求的操作是哪个. 我们只需在程序运行时指定具体的请求接受者即可,此时 ...
- 乐在其中设计模式(C#) - 命令模式(Command Pattern)
原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...
- 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释
命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...
- c++命令模式command
c++命令模式command 概念 角色和职责 案例 概念 Command模式也叫命令模式 ,是行为设计模式的一种.Command模式通过被称为 Command的类封装了对目标对象的调用行为以及调用参 ...
- Head First 设计模式中的命令模式 的一个错误
最近在看Head First 设计模式,其中命令模式中有讲到实现撤销功能,并且作者还出了一道题, 下面的是书中习题: public class MarcoCommand implements Comm ...
最新文章
- OpenCV编程案例:使用轮廓函数检测连通区域
- [03] 处理注解:反射
- Weblogic 集群部署说明 --转
- gitlab 迁移、升级打怪之路:8.8.5-- 8.10.8 -- 8.17.8 -- 9.5.9 -- 10.1.4 -- 10.2.5
- VTK:图表之ScaleVertices
- GitHub Actions,卧槽!牛批!
- 对称加密算法-DES以及DESede算法
- 在raspbian上配置apache2/subversion/xdebug及mysql远程访问
- 使用spring框架时,使用xml还是注解
- DDL、DML、DQL、DCL 理解
- python知识点总结_20211231
- C# 三菱PLC上位机开发环境搭建
- Typescript的优缺点和面试题
- 华为交换机 查ip冲突_华为交换机发现邻居操作,查看端口和ip
- a标签href属性的用法
- 计算机中丢失XINPUT无法修复,xinput1_3.dll丢失怎么修复
- 交互设计师眼中的需求分析
- windows10多桌面创建 切换 和分屏
- html如何给盒子设置位置,CSS盒子定位
- Python编写程序计算如下的分段函数