C++ 实现简单观察者模式
来源:互联网 发布:国际网络征婚骗局案例 编辑:程序博客网 时间:2024/05/22 09:15
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="cpp">//头文件/* *观察者模式---C++实现 * By-Metoor */#ifndef _NotifyUtil_H_#define _NotifyUtil_H_#include <vector>#include <map>#include <functional>#include <string>class NotifyUtil {public:static NotifyUtil* getInstance();//订阅消息 <!--注意,订阅后在释放对象时一定要取消订阅-->void addObserver(const std::string &objectName, const std::string &messageName, std::function<void(void*)> func);//发布消息void postNotification(const std::string &messageName);void postNotification(const std::string &messageName, void* data);//取消订阅void removeObserve(const std::string &objectName, const std::string &messageName);private:NotifyUtil();private:static NotifyUtil* m_notifyUtil;std::map<std::string, std::map<std::string, std::function<void(void*)> > > m_funcMap;};#endif
<span style="font-family: Arial, Helvetica, sans-serif;"></span>
<span style="font-family: Arial, Helvetica, sans-serif;"></span>
<span style="font-family: Arial, Helvetica, sans-serif;">//cpp文件</span>
#include "NotifyUtil.h"using namespace std;NotifyUtil* NotifyUtil::m_notifyUtil = NULL;NotifyUtil::NotifyUtil(){}NotifyUtil* NotifyUtil::getInstance(){if (m_notifyUtil == NULL){m_notifyUtil = new NotifyUtil();} return m_notifyUtil;}void NotifyUtil::addObserver(const std::string &objectName, const std::string &messageName, std::function<void(void*)> func){if (m_funcMap.find(messageName) != m_funcMap.end()){//如果消息已有人订阅map<string, function<void(void*)> > &funcMap = m_funcMap.at(messageName);funcMap.insert(pair<string, function<void(void*)> >(objectName, func));}else{//消息第一次被订阅map<string, function<void(void*)> > funcMap;funcMap.insert(pair<string, function<void(void*)> >(objectName, func));m_funcMap.insert(pair<string, map<string, function<void(void*)> > >(messageName, funcMap));}}void NotifyUtil::postNotification(const std::string &messageName){if (m_funcMap.find(messageName) != m_funcMap.end()){map<string, function<void(void*)> > &funcMap = m_funcMap.at(messageName);//遍历订阅了该消息的对象,调用其回调函数for(auto iter = funcMap.begin(); iter != funcMap.end(); ++iter){iter->second(nullptr);}}}void NotifyUtil::postNotification(const std::string &messageName, void* data){if (m_funcMap.find(messageName) != m_funcMap.end()){map<string, function<void(void*)> > &funcMap = m_funcMap.at(messageName);//遍历订阅了该消息的对象,调用其回调函数for(auto iter = funcMap.begin(); iter != funcMap.end(); ++iter){iter->second(data);}}}void NotifyUtil::removeObserve(const std::string &objectName, const std::string &messageName){map<string, function<void(void*)> > &funcMap = m_funcMap.at(messageName);funcMap.erase(funcMap.find(objectName));}
<pre name="code" class="cpp">//测试文件#include "NotifyUtil.h"#include <iostream>using namespace std;int main(){NotifyUtil::getInstance()->addObserver("589", "test2", [](void* v){ if(v == nullptr){cout << "---589---我接受的来自 test2 的消息...." <<endl; }else{cout << "---589---我接受的来自 test2 的消息.... data:" << (char*)v <<endl; }});NotifyUtil::getInstance()->addObserver("899","test2", [](void* v){ if(v == nullptr){cout << "---899---我接受的来自 test2 的消息...." <<endl; }else{cout << "---899---我接受的来自 test2 的消息.... data:" << (char*)v <<endl; }});NotifyUtil::getInstance()->removeObserve("589", "test2");NotifyUtil::getInstance()->postNotification("test2");NotifyUtil::getInstance()->postNotification("test2", (void*)"123456");return 0;}
</pre><img src="http://img.blog.csdn.net/20151014120427209?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="测试截图" /><img src="http://img.blog.csdn.net/20151014120257236?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="测试截图" /><pre>
0 0
- 观察者模式简单实现
- 观察者模式的简单实现
- 观察者模式实现简单聊天
- C++ 实现简单观察者模式
- js观察者模式简单实现
- 简单实现的观察者模式
- Android观察者模式简单实现
- 观察者模式(简单的实现)
- 一个简单观察者模式的实现 cocos2dx
- 观察者模式java的简单实现
- KVO 观察者模式及简单实现
- 最简单的观察者模式实现
- RCTDeviceEventEmitter 实现简单的观察者模式
- Android观察者模式的简单实现demo
- Android观察者模式的简单实现demo
- Objective C中实现观察者模式
- 观察者模式(C语言实现)
- javamail实现发送邮件并简单实现观察者模式
- Java:Effective Java 学习笔记(第49条:基本类型优先于装箱基本类型)
- 常见的WAMP集成环境
- JMS ActiveMQ研究文档
- C语言入门——常量和变量
- Android Fragment实现导航栏
- C++ 实现简单观察者模式
- Android保存图片到系统图库
- 经典感悟:你的人生,是你的
- iOS 带有震荡效果的动画
- NSMutableDictionary Class Reference
- IOS顺时针传值-模型传值
- MySql记录一(从安装开始)
- 控制器之间块的使用
- 【iOS开发】---- ALAsset,ALAssetsLibrary,ALAssetsgroup常见属性及用法