C++11 Observer--改进观察者模式

// Observer.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <string>
#include <functional>
#include <map>
using namespace std;

class NonCopyable
{
protected:
	NonCopyable() = default;
	~NonCopyable() = default;
	// 禁用复制构造
	NonCopyable(const NonCopyable&) = delete;
	// 禁用赋值构造
	NonCopyable& operator = (const NonCopyable&) = delete;
};

template<typename Func>
class Events :NonCopyable
{
public:
	Events() {}
	~Events() {}
	// 注册观察者,支持右值引用
	int Connect(Func&& f)
	{
		return Assign(f);
	}

	//  注册观察者
	int Connect(const Func&f)
	{
		return Assign(f);
	}
	// 移除观察者
	void Disconnect(int key)
	{
		m_connections.erase(key);
	}

	// 通知所有观察者
	template<typename... Args>
	void Notify(Args&&... args)
	{
		for (auto& it:m_connections)
		{
			it.second(forward<Args>(args)...);
		}
	}
private:
	//保存观察者并分配观察者的编号 
	template<typename F>
	int Assign(F&& f)
	{
		int k = m_observerId++;
		m_connections.emplace(k, forward<F>(f));
		return k;
	}
	// 观察者对应的编号
	int m_observerId = 0;
	// 观察者列表
	map<int, Func> m_connections;
};

struct stA
{
	int a, b;
	void print(int a, int b) { cout << a << ", " << b << endl; }
};

void print(int a, int b) { cout << a << ", " << b << endl; }
int main()
{
	Events<function<void(int, int)>> myevent;
	// 以函数方式注册观察者
	auto key = myevent.Connect(print);

	stA t;
	// lamda注册function注册
	auto lambdakey = myevent.Connect([&t](int a, int b) {t.a = a; t.b = b; });
	function<void(int, int)> f = bind(&stA::print, &t, placeholders::_1, placeholders::_2);
	myevent.Connect(f);
	int a = 1,  b = 2;
	myevent.Notify(a, b);

	myevent.Disconnect(key);
}

结果显示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蚂蚁_CrkRes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值