23种设计模式C++源码与UML实现--命令模式
命令模式
Command
模式也叫命令模式,是行为设计模式的一种。Command
模式通过被称为Command
的类封装了对目标对象的调用行为以及调用参数。
在面向对象的程序设计中,一个对象调用另外一个对象,一边情况下调用的过程是,创建目标对象实例;设置调用参数,调用目标对象的方法。
但是有些情况下有必要使用一个专门的类对这种调用过程加以封装,我们把这种专门的类称作Command
类。
整个调用过程比较繁杂,或者存在多处这种调用。这时,使用Command
类对该调用加以封装,便于功能的再利用。
调用前后需要对调用参数进行某些处理。调用前后需要进行某些额外的处理,比如日志,缓存、记录历史操作等。
角色和职责
Command
Command
命令的抽象类
ConcreteCommand
ConcreteCommand
的具体实现类
Receiver
Invorker
通过Invorker
执行Command
对象
适用于
是将一个请求封装为一个对象,从而使你可以使用不同的请求,对客户端进行参数初始化;对请求排队或记录请求日志,以及支持可撤销的操作
仅仅实现命令的执行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GeX5EdLe-1606658989604)(image/image-20201123232731749.png)]
首先实现,后半部分,也就是实现命令的执行,前面半部分相当于当看病的人多的时候需要,需要排队,这似乎invoker
就开始登场啦。
//
// Created by andrew on 2020/11/23.
//
#include <iostream>using namespace std;class Doctor {public:void treatEye() {cout << "treat eye" << endl;}void treatNose() {cout << "treat nose" << endl;}
};class CommandTreatEye {public:explicit CommandTreatEye(Doctor *doctor) {m_doctor = doctor;}void treat() {m_doctor->treatEye();}private:Doctor *m_doctor;
};class CommandTreatNose {public:explicit CommandTreatNose(Doctor *doctor) {m_doctor = doctor;}void treat() {m_doctor->treatNose();}private:Doctor *m_doctor;
};int main(int argc, char *argv[]) {// 通过一个命令 调用医生实现病的治疗Doctor *dcotor = new Doctor;CommandTreatEye *commandTreatEye = new CommandTreatEye(dcotor);commandTreatEye->treat();delete commandTreatEye;delete dcotor;return 0;
}
完整的实现,支持排队+执行的命令模式
//
// Created by andrew on 2020/11/23.
//
#include <iostream>
#include <list>using namespace std;class Doctor {public:void treatEye() {cout << "treat eye" << endl;}void treatNose() {cout << "treat nose" << endl;}
};class Command {public:virtual void treat() = 0;virtual ~Command() = default;
};class CommandTreatEye : public Command {public:explicit CommandTreatEye(Doctor *doctor) {m_doctor = doctor;}void treat() override {m_doctor->treatEye();}private:Doctor *m_doctor;
};class CommandTreatNose : public Command {public:explicit CommandTreatNose(Doctor *doctor) {m_doctor = doctor;}void treat() override {m_doctor->treatNose();}private:Doctor *m_doctor;
};//小护士
class BeautyNurse {public:explicit BeautyNurse(Command *command) {this->command = command;}void SubmittedCase() { // 提交病历 下单命令command->treat();}private:Command *command;
};class HeadNurse {public:HeadNurse() {m_list.clear();}void setCommand(Command *command) {m_list.push_back(command);}void SubmittedCase() { // 提交命令for (auto & it : m_list) {it->treat();}}private:list<Command *> m_list;
};void nurseCommand() {BeautyNurse *beautyNurse = nullptr;Doctor *doctor = nullptr;Command *command = nullptr;doctor = new Doctor;
//command = new CommandTreatNose(doctor);beautyNurse = new BeautyNurse(command);beautyNurse->SubmittedCase();delete doctor;delete command;delete beautyNurse;
}void headNurseCommand() {// 护士长 提交病历 给以上看病HeadNurse *headNurse = NULL;Doctor * doctor = NULL;Command *command1 = NULL;Command *command2 = NULL;doctor = new Doctor;command1 = new CommandTreatEye(doctor);command2 = new CommandTreatNose(doctor);headNurse = new HeadNurse;headNurse->setCommand(command1);headNurse->setCommand(command2);headNurse->SubmittedCase(); // 护士长 批量下单命令delete doctor;delete command1;delete command2;delete headNurse;
}int main(int argc, char *argv[]) {// 通过一个命令 调用医生实现病的治疗 命令的执行部分实现/* Doctor *dcotor = new Doctor;CommandTreatEye *commandTreatEye = new CommandTreatEye(dcotor);commandTreatEye->treat();delete commandTreatEye;delete dcotor;*///nurseCommand();headNurseCommand();return 0;
}
23种设计模式C++源码与UML实现--命令模式相关推荐
- 23种设计模式C++源码与UML实现--外观模式
外观模式 facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种,facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单界面.这个一致的简单的界面被称为fac ...
- 23种设计模式C++源码与UML实现--建造者模式
建造者模式 代码仓库地址:建造者模式 Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建模式之一,用来隐藏复合对象的创建过程.他把 ...
- 23种设计模式C++源码与UML实现--迭代器模式
迭代器模式 Iterator模式也叫迭代模式,是行为模式之一,他把对容器种包含的内部对象的访问委让给外部类,使用Iterator按顺序进行遍历访问的设计模式. 在使用Iterator模式之前,首先应该 ...
- 23种设计模式C++源码与UML实现--原型模式
原型模式 一个复杂对象,具有自我复制功能,统一一套接口. 原型模式主要面对的问题是:某些结构复杂的对象的创建工作,由于需求的变化,这些对象进场面对着剧烈的变化,但是他们却拥有比较一致的接口. 原型模式 ...
- 23种设计模式C++源码与UML实现--桥接模式
桥接模式 Bridge模式,又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为让类承担不同的责任.它的主要特点是把抽象(Abstractio ...
- 23种设计模式C++源码与UML实现--状态模式
状态模式 State模式也叫状态模式,是行为模式的一种,State模式允许通过改变对象的内部状态而改变对象的行为,这个对象变现的好像修改了它的类一样. 状态模式主要解决的事当控制一个对象状态的条件表达 ...
- 23种设计模式C++源码与UML实现--策略模式
策略模式 Strategy模式也叫策略模式,是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交给客户端决定. ...
- 23种设计模式C++源码与UML实现--组合模式
组合模式 Composite模式也叫做组合模式,是构造型的设计模式之一.通过递归的手段构造树形的对象结构,并可以通过一个对象来访问整个对象树. Component树形结构的节点抽象 为所有的对象定义统 ...
- 23种设计模式C++源码与UML实现--工厂模式
工厂模式 工厂方法模式同样属于类的创建型模式,又被称为多态工厂模式.工厂方法的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不在负责产品的创建,这样核心类成为一个抽象 ...
最新文章
- Android应用实例收藏管理
- 2021春季每日一题【week6 未完结】
- 操作系统核心原理-5.内存管理(中):分页内存管理
- c 窗体程序 mysql_C\C++开发MySQL程序简介(下)
- MySQL replace into 用法
- 移植ubuntu14.04根文件系统至beaglebone开发板探索
- 设计高性能大并发WEB系统架构注意点
- LIS和LCS LCIS
- android bool转字符串,Android 知识点——当json传入字符串,使用Boolean接收时,GSON会将其转换为false...
- 木.马查杀-应急工具-排查步骤
- 宇视存储服务器vs系列,宇视产品系列之存储产品篇1.pptx
- 计算机文件夹无法排序,win7系统怎么无法排序磁盘文件夹?手动排序方法
- 推荐系统-基于用户的推荐在社交网络中的应用
- BeanUtils.copyProperties 和 fastjson 性能对比
- Android知识体系思维导图
- gulp less编译css压缩和js压缩别名输出
- 让计算机网络与作文教学,“基于计算机和网络环境下的写作教学研究”课题组 2015-2016学年度上学期研究计划...
- 农村信用社计算机岗位考什么条件,说说农村信用社考试考什么
- 三万元存一年,利息是多少?银行工作人员:这么存最合算!
- pycharm光标变粗变宽