`

C++11应用:观察者模式(多函数对象回调)

 
阅读更多

    CallbackNotify.hpp

#pragma once

#include <map>

template <typename Func>
class CallbackNotify
{
private:
	CallbackNotify(const CallbackNotify&) = delete; // 禁用复制函数
	CallbackNotify& operator= (const CallbackNotify&) = delete; // 禁用赋值构造

	int m_observerId = 0; // 观察者对应的编号
	std::map<int, Func> m_connections; // 观察者列表

									   // 保存观察者并分配观察者编号
	template <typename F>
	int Assign(F&& f)
	{
		int k = m_observerId++;
		m_connections.emplace(k, std::forward<F>(f));
		return k;
	}
public:
	CallbackNotify() = default;// 使用C++11提供的默认构造函数
	virtual ~CallbackNotify() {
		m_connections.clear();
		m_observerId = 0;
	}
	// 注册观察者,支持右值引用
	int Connect(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(std::forward<Args>(args)...); // 函数对象执行参数
		}
	}
};

    测试:

#include <iostream>
#include <string>  

#include <functional>

#include "CallbackNotify.hpp"

using namespace std;
   
struct TestA
{
	int a;
	int b;
	void print(int x, int y)
	{
		cout << "TestA print:" << x << "," << y << endl;
	}
	void printNoParam() {
		cout << "TestA printNoParam:" << a << "," << b << endl;
	}
};

void printLocal(int a, int b) {
	cout << "printLocal:" << a << "," << b << endl;
}

void test() {
	CallbackNotify<std::function<void(int, int)>> myevent; // 申明注册的函数对象是两个参数的int
	auto key1 = myevent.Connect(std::move(printLocal)); // 以函数方式注册观察者

	TestA testA;
	auto key2 = myevent.Connect([&testA](int a, int b) {testA.a = a; testA.b = b; }); // lambda注册

	auto key3 = myevent.Connect([](int a, int b) {cout << "lambda print:" << a << "," << b << endl; }); // lambda注册

																										// std::function注册
	std::function<void(int, int)> f1 = std::bind(&TestA::print, &testA, std::placeholders::_1, std::placeholders::_2);
	auto key4 = myevent.Connect(std::move(f1));

	std::function<void(int, int)> f2 = printLocal;
	auto key5 = myevent.Connect(std::move(f2));

	int a = 1;
	int b = 2;
	myevent.Notify(a, b); // 触发

	testA.printNoParam();

	myevent.Disconnect(key1); //移除
	 
}
int main(int, char *[])
{     
	test();

	system("pause");
	return 0;
}

  

分享到:
评论

相关推荐

    C++11 function 委托机制 观察者模式,适用于界面开发,lambda表达式

    本文将深入探讨C++11中的函数委托、观察者模式以及Lambda表达式的应用,特别是它们如何在界面开发中发挥作用。 首先,C++11的函数委托是通过函数对象(functor)或者函数指针实现的。它提供了一种方式来保存一个...

    观察者模式设计(C++)

    在C#中,委托和事件是实现观察者模式的主要手段,而C++中虽然没有内置的委托和事件机制,但可以通过模板、函数指针、回调函数等方式来模拟类似的功能。MFC(Microsoft Foundation Classes)框架中,消息投递机制就是...

    当析构函数遇到多线程── C++ 中线程安全的对象回调 PDF

    ### 当析构函数遇到多线程——C++中线程安全的对象回调 #### 1. 多线程下的对象生命期管理 C++作为一种需要程序员手动管理对象生命周期的语言,在多线程环境中尤其需要谨慎处理对象的创建和销毁过程。由于多线程...

    c++观察者模式与委托机制的结合

    C++ 中的观察者模式通常通过定义一个主题类(Subject),它持有一个或多个观察者(Observer)的引用,当主题的状态发生改变时,会调用观察者的更新方法。 在给定的标题和描述中,我们看到观察者模式与委托机制...

    vc 回调函数的样例

    回调函数在计算机编程中是一种非常重要的机制,尤其在C++和C这样的编程语言中,它允许我们传递一个函数作为参数给另一个函数,这样被调用的函数可以在适当的时候执行我们提供的函数。在Windows API中,回调函数常常...

    设计模式-观察者模式-作业-observer.zip

    观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或发布-...

    CallBack回调函数

    7. **回调函数与设计模式**:回调函数是观察者模式、发布订阅模式等设计模式的一种实现方式,帮助实现松耦合的系统。 总的来说,回调函数是软件开发中不可或缺的一部分,它提供了处理异步操作和事件响应的有效手段...

    The_C++_Standard_Library(c++中文版).pdf 编程必备

    - Function(观察者)库:提供了函数对象和回调机制的高级特性。 - Signals库:用于实现信号和槽机制,可以用于事件处理和观察者模式。 - Variants库:用于类型安全的联合体,可以持有多种类型的一种。 - Tuples...

    观察者模式代码demo

    1. **创建观察者**:首先,你需要创建一个观察者对象,该对象通常需要实现一个或多个特定的回调函数,这些函数会在接收到通知时被调用。 2. **注册观察者**:使用`CCNotificationCenter`的`addObserver`方法,传入...

    c++23种设计模式

    C++中,观察者模式通常通过事件机制或回调函数实现。 8. 装饰模式:动态地给一个对象添加一些额外的职责。在C++中,装饰模式可以通过继承和组合来实现,保持原有类的接口不变。 9. 外观模式:提供一个统一的接口,...

    Cocos2d-x观察者模式其实很简单!!--之游戏开发《赵云要格斗》

    1. **观察者模式的基本概念**:观察者模式是一种行为设计模式,它让多个对象(观察者)订阅一个主题(被观察者),当主题状态改变时,会通知所有订阅者。在C++中,观察者通常是一个类,它实现了特定的回调接口。 2....

    设计模式C++Code版

    6. **观察者模式**:观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。C++中可以使用`std::function`和`std::vector`来实现事件发布和订阅。 7....

    DesignPattern(VS2019_观察者模式_工厂模式_抽象工厂模式)完整示例源代码.zip

    **观察者模式**是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在C++中,观察者模式通常通过定义主题(Subject)和观察者...

    C.C++设计模式

    3. **观察者模式**(发布-订阅):定义对象间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新。C++中可以使用STL的信号槽库如Boost.Signals2,C语言则可以通过回调函数和事件...

    headfirst设计模式C++代码实现

    C++可以通过事件驱动和回调函数来实现这一模式。 责任链模式允许将请求沿着处理者链传递,直到某个处理者处理请求。每个处理者都可以选择处理请求或将其传递给链上的下一个处理者。C++中可以使用指针或引用链表来...

    C++设计模式代码资源1.zip

    3. **观察者模式**:定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在C++中,通常通过事件驱动和回调函数来实现。 4. **装饰器模式**:动态地给一个对象...

    C++设计模式原理与实战视频课.txt打包整理.zip

    C++中的命令模式通常涉及到函数指针或回调函数。 此外,课程还可能涉及其他如观察者模式、策略模式等,这些模式都是为了提高代码的复用性和可扩展性。 通过这个课程,开发者不仅可以掌握C++设计模式的基本概念,还...

    C++版设计模式

    C++中,命令模式涉及到了函数对象(functor)和回调机制。 14. **解释器模式**:给定一个语言,定义它的文法表示,并且提供一个解释器来处理这种语言中的句子。在C++中,可以利用递归和抽象语法树来实现。 15. **...

    C++设计模式学习框架

    同时,C++11及后续标准引入的新特性,如智能指针(Smart Pointers)和Lambda表达式,进一步增强了设计模式的应用,比如在资源管理中使用弱引用实现更安全的单例,或者使用Lambda简化回调函数的处理。 学习这个框架...

Global site tag (gtag.js) - Google Analytics