命令模式

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实现--命令模式相关推荐

  1. 23种设计模式C++源码与UML实现--外观模式

    外观模式 facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种,facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单界面.这个一致的简单的界面被称为fac ...

  2. 23种设计模式C++源码与UML实现--建造者模式

    建造者模式 代码仓库地址:建造者模式 Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建模式之一,用来隐藏复合对象的创建过程.他把 ...

  3. 23种设计模式C++源码与UML实现--迭代器模式

    迭代器模式 Iterator模式也叫迭代模式,是行为模式之一,他把对容器种包含的内部对象的访问委让给外部类,使用Iterator按顺序进行遍历访问的设计模式. 在使用Iterator模式之前,首先应该 ...

  4. 23种设计模式C++源码与UML实现--原型模式

    原型模式 一个复杂对象,具有自我复制功能,统一一套接口. 原型模式主要面对的问题是:某些结构复杂的对象的创建工作,由于需求的变化,这些对象进场面对着剧烈的变化,但是他们却拥有比较一致的接口. 原型模式 ...

  5. 23种设计模式C++源码与UML实现--桥接模式

    桥接模式 Bridge模式,又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为让类承担不同的责任.它的主要特点是把抽象(Abstractio ...

  6. 23种设计模式C++源码与UML实现--状态模式

    状态模式 State模式也叫状态模式,是行为模式的一种,State模式允许通过改变对象的内部状态而改变对象的行为,这个对象变现的好像修改了它的类一样. 状态模式主要解决的事当控制一个对象状态的条件表达 ...

  7. 23种设计模式C++源码与UML实现--策略模式

    策略模式 Strategy模式也叫策略模式,是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交给客户端决定. ...

  8. 23种设计模式C++源码与UML实现--组合模式

    组合模式 Composite模式也叫做组合模式,是构造型的设计模式之一.通过递归的手段构造树形的对象结构,并可以通过一个对象来访问整个对象树. Component树形结构的节点抽象 为所有的对象定义统 ...

  9. 23种设计模式C++源码与UML实现--工厂模式

    工厂模式 工厂方法模式同样属于类的创建型模式,又被称为多态工厂模式.工厂方法的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不在负责产品的创建,这样核心类成为一个抽象 ...

最新文章

  1. Android应用实例收藏管理
  2. 2021春季每日一题【week6 未完结】
  3. 操作系统核心原理-5.内存管理(中):分页内存管理
  4. c 窗体程序 mysql_C\C++开发MySQL程序简介(下)
  5. MySQL replace into 用法
  6. 移植ubuntu14.04根文件系统至beaglebone开发板探索
  7. 设计高性能大并发WEB系统架构注意点
  8. LIS和LCS LCIS
  9. android bool转字符串,Android 知识点——当json传入字符串,使用Boolean接收时,GSON会将其转换为false...
  10. 木.马查杀-应急工具-排查步骤
  11. 宇视存储服务器vs系列,宇视产品系列之存储产品篇1.pptx
  12. 计算机文件夹无法排序,win7系统怎么无法排序磁盘文件夹?手动排序方法
  13. 推荐系统-基于用户的推荐在社交网络中的应用
  14. BeanUtils.copyProperties 和 fastjson 性能对比
  15. Android知识体系思维导图
  16. gulp less编译css压缩和js压缩别名输出
  17. 让计算机网络与作文教学,“基于计算机和网络环境下的写作教学研究”课题组  2015-2016学年度上学期研究计划...
  18. 农村信用社计算机岗位考什么条件,说说农村信用社考试考什么
  19. 三万元存一年,利息是多少?银行工作人员:这么存最合算!
  20. pycharm光标变粗变宽

热门文章

  1. linux系统之我的选择
  2. 系统的MAC地址修改
  3. nyoj 685查找字符串
  4. nyoj- 117 求逆序数 hdu-sort it---- 树状数组
  5. Kotlin学习笔记-----函数的定义
  6. Hadoop-Yarn-框架原理及运作机制
  7. Java中 equals() 和 == 的区别
  8. 一种高效快速的内存池实现(附源码)
  9. uvalive 4795 Paperweight
  10. PROTEUS串口仿真遇到的BUG(转载)