c++事件总线模型

什么是事件总线,它是发布-订阅模式的一种实现。

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

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

template <typename EventClass>
class EventBus {
public:
	EventBus() = default;
	~EventBus() = default;

	static void Register(std::weak_ptr<EventClass> 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<EventClass> 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<typename EventFun, typename... EventArgs>
	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<std::weak_ptr<EventClass>> events_;
};

template <typename EventClass>
std::list<std::weak_ptr<EventClass>> EventBus<EventClass>::events_;

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

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

class Test_One : public std::enable_shared_from_this<Test_One>,
				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<Test_Two>,
				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<Test_One>();
	auto weak_ptr1 = std::weak_ptr<Base>(ptr1);
	auto ptr2 = std::make_shared<Test_Two>();
	auto weak_ptr2 = std::weak_ptr<Base>(ptr2);
	
	EventBus<Base>::Register(weak_ptr1);
	EventBus<Base>::Register(weak_ptr2);
	
	EventBus<Base>::OnEvent(&Base::print, 123);

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

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

	return 0;
}

运行结果:

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

附:

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Fireplusplus

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

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

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

打赏作者

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

抵扣说明:

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

余额充值