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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小米5x显示耳机怎么办 手机进水听音乐人声小怎么办 华为荣耀v8手机音量小怎么办 手机充电孔松了怎么办 华为荣耀7卡顿怎么办 华为手机话筒没声音怎么办 苹果x耳机进水了怎么办 苹果6p进水了怎么办 华为手机声音变耳机模式怎么办 手机设置成耳机模式怎么办 opop耳机一个没有声音怎么办 oppo手机上显示耳机模式怎么办 微信显示耳机模式怎么办 微信变成耳机模式怎么办 5s变成耳机模式怎么办 华为手机一直是耳机模式怎么办 华为手机进水了耳机模式怎么办 蓝牙耳机通话声音小怎么办 华为手机自动进入耳机模式怎么办 华为手机耳机怎么挂了电话怎么办 华为手机听筒声音小怎么办 华为p9手机听筒声音小怎么办 苹果6总是耳机模式怎么办 苹果没有插耳机模式怎么办 苹果手机切换耳机模式怎么办 苹果6s出现耳机模式怎么办 苹果6变成了耳机模式怎么办 苹果手机成耳机模式了怎么办 华为mate8耳机声音小怎么办 移动sim卡丢了怎么办 蓝牙耳机开不开机怎么办 苹果手机蓝牙不匹配怎么办 苹果6蓝牙坏了怎么办 蓝牙密钥不正确不匹配怎么办 华为p6开不了机怎么办 华为c199手机不停重启怎么办 华为手机用户数据被锁定怎么办 朵唯手机丢了怎么办 网件r6220穿墙差怎么办 无线网打王者卡怎么办 酷翼x9忘了密码怎么办