设计模式——命令模式(C++实现)

  1 [[email protected] ~/learn_code/design_pattern/19_order]$ cat order.cpp
  2 #include <iostream>
  3 #include <string>
  4 #include <vector>
  5 #include <algorithm>
  6 #include <iterator>
  7
  8 using namespace std;
  9
 10 class Receiver
 11 {
 12 public:
 13         void BakeMutton()
 14         {
 15                 cout<< "烤羊肉"<< endl;
 16         }
 17
 18         void BakeChicken()
 19         {
 20                 cout<< "烤鸡翅"<< endl;
 21         }
 22 };
 23
 24 class Command
 25 {
 26 public:
 27         Command(Receiver* pstReceiver):m_pstReceiver(pstReceiver)
 28         {
 29
 30         }
 31         virtual void Excute() = 0;
 32
 33 protected:
 34         Receiver* m_pstReceiver;
 35 };
 36
 37 class ConcreteCommandA: public Command
 38 {
 39 public:
 40         ConcreteCommandA(Receiver* pstReceiver):Command(pstReceiver)
 41         {
 42
 43         }
 44         virtual void Excute()
 45         {
 46                 cout<< "ConcreteCommandA excuting......"<< endl;
 47                 m_pstReceiver->BakeMutton();
 48         }
 49
 50 };
 51
 52 class ConcreteCommandB: public Command
 53 {
 54 public:
 55         ConcreteCommandB(Receiver* pstReceiver):Command(pstReceiver)
 56         {
 57
 58         }
 59         virtual void Excute()
 60         {
 61                 cout<< "ConcreteCommandB excuting......"<< endl;
 62                 m_pstReceiver->BakeChicken();
 63         }
 64 };
 65
 66 class Invoke
 67 {
 68 public:
 69         void Add(Command* pstCommand)
 70         {
 71                 m_vecPstCommand.push_back(pstCommand);
 72         }
 73         void Remove(Command* pstCommand)
 74         {
 75                 m_vecPstCommand.erase(find(m_vecPstCommand.begin(), m_vecPstCommand.end(), pstCommand));
 76         }
 77         void RemoveAll()
 78         {
 79                 m_vecPstCommand.clear();
 80         }
 81         void Notify()
 82         {
 83                 for (typeof(m_vecPstCommand.begin()) it = m_vecPstCommand.begin(); it != m_vecPstCommand.end(); ++it)
 84                 {
 85                         (*it)->Excute();
 86                 }
 87         }
 88
 89 private:
 90         vector<Command*> m_vecPstCommand;
 91 };
 92
 93 int main(int argc, char* argv[])
 94 {
 95         Receiver* pstReceiver = new Receiver();
 96         Command* pstConcreteCommandA = new ConcreteCommandA(pstReceiver);
 97         Command* pstConcreteCommandB = new ConcreteCommandB(pstReceiver);
 98         Invoke* pstInvoke = new Invoke();
 99
100         pstInvoke->Add(pstConcreteCommandA);
101         pstInvoke->Add(pstConcreteCommandA);
102         pstInvoke->Add(pstConcreteCommandB);
103         pstInvoke->Notify();
104         cout<< "------------------"<< endl<< endl;
105
106         pstInvoke->Remove(pstConcreteCommandA);  //撤销操作
107         pstInvoke->Remove(pstConcreteCommandB);
108         pstInvoke->Notify();
109         cout<< "------------------"<< endl<< endl;
110
111         return 0;
112 }
113 ////////////////////////////////////////
114 [[email protected] ~/learn_code/design_pattern/19_order]$ ./order
115 ConcreteCommandA excuting......
116 烤羊肉
117 ConcreteCommandA excuting......
118 烤羊肉
119 ConcreteCommandB excuting......
120 烤鸡翅
121 ------------------
122
123 ConcreteCommandA excuting......
124 烤羊肉
125 ------------------
时间: 2024-08-04 18:33:53

设计模式——命令模式(C++实现)的相关文章

设计模式 - 命令模式(command pattern) 具体解释

命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对象, 以便使用不同的请求\队列\日志来參数化其它对象. 命令模式也能够支持撤销操作. 简单的命令模式的实现: 1. 详细的类, 每个类都有特定的方法: /** * @time 2014年6月9日 */ package command; /** * @author C.L.Wang * */ publ

设计模式 - 命令模式(command pattern) 详解

命令模式(command pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 命令模式: 将请求封装成对象, 以便使用不同的请求\队列\日志来参数化其他对象. 命令模式也支持可撤销操作. 命令模式: 调用者(Invoker); 命令(Command): 可执行方法(execute), 具体命令(Concrete Command); 接受者(Receiver): 调用命令(Set Command); 具体方法: 1. 具体对象. /** *

设计模式 - 命令模式(command pattern) 多命令 详解

命令模式(command pattern) 多命令 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考命令模式: http://blog.csdn.net/caroline_wendy/article/details/31379977 具体步骤: 1. 多命令, 把未使用的命令, 初始化为空对象(NoCommand), 根据参数(slot), 选择输出命令. /** * @time 2014年6月16日 */ package command; /**

设计模式 - 命令模式(command pattern) 撤销(undo) 详解

命令模式(command pattern) 撤销(undo) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考命令模式: http://blog.csdn.net/caroline_wendy/article/details/31379977 命令模式可以用于执行撤销(undo)操作. 具体方法: 1. 对象类中需要保存状态, 如level. package command; public class CeilingFan { String loca

设计模式 - 命令模式(command pattern) 宏命令(macro command) 详解

命令模式(command pattern) 宏命令(macro command) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考: 命名模式(撤销): http://blog.csdn.net/caroline_wendy/article/details/31419101 命令模式可以执行宏命令(macro command), 即多个命令的组合操作. 具体方法:  1. 其余代码与命令(撤销)一致 2. 添加宏命令(macro command),

设计模式--命令模式(Command)

基本概念: Command模式也叫命令模式 ,是行为设计模式的一种.Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数,命令模式将方法调用给封装起来了. 命令模式的几个角色: Command: 抽象命令类 ConcreteCommand: 具体命令类 Invoker: 调用者 Receiver: 接收者 Client:客户类 命令模式的优缺点: 优点 1. 降低了系统耦合度 2. 新的命令可以很容易添加到系统中去. 缺点 使用命令模式可能会导致某些系统有过多的具

读书笔记之设计模式-命令模式

行为型:Command(命令模式) 命令模式: 目的:其实一般设计模式就是为了解耦.也没什么特别的,命令模式实际上就是将命令的请求者和命令的执行者解耦. 白话:领导说了,让把这个月的项目计划压缩到三个礼拜完成,还说了:"不管你用什么办法".这句“不管你用什么办法”就是我们所说的解耦.我不需要关心你怎么去做,我只要你能实现我想达到的目的. 模式结构:一般包含下面几个部分. Client:客户 Invoker:命令触发者 Command:命令 ConcreteCommand:具体命令实现

PHP设计模式——命令模式

声明:本系列博客参考资料<大话设计模式>,作者程杰. 命令模式:在软件系统中,"行为请求者"与"行为实现者"通常呈现一种"紧耦合".但在某些场合,比如要对行为进行"记录.撤销/重做.事务"等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,实现二者之间的松耦合.这就是命令模式. 类图: 角色分析: 抽象命令

设计模式-命令模式(Go语言描述)

在上一篇博客设计模式-单例模式(Go语言描述)中我们介绍了在golang中如何去实现单例模式,在文章的最后我们也介绍到了golang独有的一种实现单例的方式-sync.Once.Do(),可以让golang轻松的实现可以应对并发请求的单利.今天我们继续探索设计模式,来介绍一下命令模式的实现. 说起命令,大家第一反应可能就是我们平时敲的各种命令,啪啪啪几行命令下去就可以完成一些功能,在看到命令模式这个词后,可能大家也会和我一样认为这里的命令就是执行一些简单任务的功能,然而并不是,这里的命令更多的像

[设计模式] 命令模式 Command

Command 模式通过将请求封装到一个对象(Command)中,并将请求的接受者存放到具体的 ConcreteCommand 类中(Receiver)中,从而实现调用操作的对象和操作的具体实现者之间的解耦. 在GOF的<设计模式:可复用面向对象软件的基础>一书中对命令模式是这样说的:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作.在OOP中,一切都是对象,将请求封装成对象,符合OOP的设计思想,当将客户的单个请求封装成对象以后