C++ 实现简单观察者模式

//头文件
/*
 *观察者模式---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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值