观察者模式结合模板化设计可实现类型安全的事件通知系统。1. 定义事件类型与回调签名,使用模板绑定事件参数,确保类型匹配;2. 实现eventbus管理订阅与发布,用unordered_map存储不同类型的handler;3. 使用时注册并发布事件,保证类型安全。需注意避免混用回调、性能优化及生命周期管理。
在实现一个类型安全的事件通知系统时,观察者模式是基础。但要让这个系统既通用又类型安全,就需要借助模板化的设计。下面讲讲怎么一步步设计这样一个系统。
观察者模式本质上是一对多的依赖关系:当某个对象状态改变时,所有依赖它的对象都会收到通知并自动更新。
而模板化(泛型)在这里的作用,主要是为了保证事件类型和处理函数之间的匹配,避免运行时错误,并提高代码复用率。
比如,你可能希望不同的事件类型(如用户登录、数据加载完成)有各自对应的监听器,而不是统一用 void* 或 any 类型传递参数。
首先,你要确定事件有哪些种类,以及每种事件的参数结构。例如:
然后定义一个通用的回调函数类型,使用模板来绑定事件参数:
template<typename EventType> using EventHandler = std::function<void(const EventType&)>;
这样,每个事件类型都有自己的 handler,编译器会帮你检查类型是否匹配。
接下来需要一个中心化的类,用来注册监听器和发布事件。可以叫它 EventBus,里面维护多个事件类型的订阅列表。
基本结构如下:
class EventBus { public: template<typename EventType> void Subscribe(EventHandler<EventType> handler) { // 存储到对应类型的 map 中 } template<typename EventType> void Publish(const EventType& event) { // 遍历对应类型的 handler 并调用 } };
这里的关键在于如何存储不同类型的 handler。一种常见做法是使用 std::unordered_map 加上 std::type_index 作为 key:
std::unordered_map<std::type_index, std::vector<std::any>> handlers_;
每个事件类型对应一个 handler 列表,发布事件时取出并调用。
假设你有一个 UserLoginEvent:
struct UserLoginEvent { std::string username; };
注册监听器:
event_bus.Subscribe<UserLoginEvent>([](const UserLoginEvent& e) { std::cout << "用户登录:" << e.username << std::endl; });
发布事件:
UserLoginEvent event{"alice"}; event_bus.Publish(event);
这样整个流程就完成了,而且完全类型安全。
基本上就这些。设计一个类型安全的观察者系统并不复杂,但有几个关键点容易忽略:回调类型匹配、事件存储方式、以及生命周期控制。把这些细节处理好,就能写出一个健壮的事件通知系统了。
以上就是怎样设计模板化的观察者模式 类型安全的事件通知系统实现的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号