//头文件
/*
*观察者模式---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
#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;
}