栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++事件总线模型

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++事件总线模型

什么是事件总线,它是发布-订阅模式的一种实现。最近从事的工作中,就用到一种事件总线机制。

事件发送者将事件发布到一个总线上(抛出事件),订阅者通过在总线上注册(监听总线),达到订阅总线事件的目的。这种模型允许不同的组件或者模块之间以较低的耦合进行通信。

 C++实现的简化版如下:

template 
class EventBus {
public:
	EventBus() = default;
	~EventBus() = default;

	static void Register(std::weak_ptr event) {
		for (auto& ev : events_) {
			auto ev_ptr = ev.lock();
			auto event_ptr = event.lock();
			if (ev_ptr == event_ptr) {
				INFO("skip exist event!");
				return;
			}
		}
		events_.emplace_back(event);
	}
	
	static void Unregister(std::weak_ptr event) {
		for (auto ev_it = events_.begin(); ev_it != events_.end(); ++ev_it) {
			auto ev_ptr = ev_it->lock();
			auto event_ptr = event.lock();
			if (ev_ptr == event_ptr) {
				events_.erase(ev_it);
				return;
			}
		}
	}

	template
	static void OnEvent(EventFun fun, EventArgs&&... args) {
		for (const auto& ev : events_) {
			auto ptr = ev.lock();
			if (!ptr) {
				ERROR("skip not exist event!");
				continue;
			}

		 	auto obj = ptr.get();
			(obj->*fun)(args...);
		}
	}

private:
	static std::list> events_;
};

template 
std::list> EventBus::events_;

其中Register与Unregister接口供监听者向总线上注册监听,OnEvent接口供事件发送者抛出事件,测试demo如下:

class Base {
public:
	virtual void print(int a) = 0;
};

class Test_One : public std::enable_shared_from_this,
				public Base {
public:
	virtual void print(int a) override {
		printf("This Is Test Print: %d !n", a);
	}
};

class Test_Two : public std::enable_shared_from_this,
				public Base {
public:
	virtual void print(int a) override {
		printf("This Is Test2 Print: %d !n", a);
	}
};


int main(int argc, char *argv[])
{
	auto ptr1 = std::make_shared();
	auto weak_ptr1 = std::weak_ptr(ptr1);
	auto ptr2 = std::make_shared();
	auto weak_ptr2 = std::weak_ptr(ptr2);
	
	EventBus::Register(weak_ptr1);
	EventBus::Register(weak_ptr2);
	
	EventBus::OnEvent(&Base::print, 123);

	INFO("unregister ptr1");
	EventBus::Unregister(weak_ptr1);
	EventBus::OnEvent(&Base::print, 123);

	INFO("unregister ptr2");
	EventBus::Unregister(weak_ptr2);
	EventBus::OnEvent(&Base::print, 123);

	return 0;
}

运行结果:

可以看到在总线上注册的模块,当事件发生时,能够执行该事件对应的动作,这就是简单的总线模型。

附:

源码:GitHub - Fireplusplus/event_bus: simple event bus for c++

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/997066.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号