
1. 背景与目标在 Qt 桌面软件开发中界面刷新、状态同步、定时更新等场景往往存在一对多通知关系。 本模块将项目中的观察者逻辑抽象为独立能力目标是解耦“事件发布者”和“界面更新者”提供可复用的注册/通知/解绑机制支持通知前后钩子便于扩展业务流程支持互斥控件保护适配寄存器同步类场景2. 观察者模式在本模块中的落地观察者模式核心思想是Subject维护观察者列表状态变化时Subject主动通知所有观察者Observer在回调中执行各自更新逻辑本模块将这一过程封装为三个核心角色SubjectWidgetModule通用发布者注册/反注册/通知ObserverWidgetModule通用观察者基类绑定/解绑/更新入口SyncByRegSubjectModule带互斥控件保护的发布者扩展3. 模块结构modules/observer_module/observer_module.hmodules/observer_module/observer_module.cppmodules/observer_module/example_usage.cpp4. 核心接口说明4.1 SubjectWidgetModule主要职责维护观察者列表线程安全分配唯一观察者 ID执行通知流程关键接口quint32 addObserver(QWidget *widget, ObserverCallback callback, void *context nullptr)bool removeObserver(quint32 observerId)void clearObservers()void notify()设计要点notify()内部先复制快照再遍历避免回调中增删订阅导致遍历失效提供onBeforeNotify()/onAfterNotify()钩子支持模板方法扩展4.2 ObserverWidgetModule主要职责封装绑定和解绑生命周期向业务子类暴露统一更新入口onUpdate()关键接口bool bind(SubjectWidgetModule *subject, QWidget *widget)void unbind()virtual void onUpdate(QWidget *widget) 0设计要点析构时自动unbind()降低资源泄漏和悬挂订阅风险unbind()幂等可重复调用4.3 SyncByRegSubjectModule主要职责在通知前后自动执行互斥控件控制依赖接口IExclusiveWidgetController行为通知前调用disableWidgets()通知后调用enableWidgets()5. 快速使用示例#include modules/observer_module/observer_module.h using namespace observer_module; class MyObserver : public ObserverWidgetModule { protected: void onUpdate(QWidget *widget) override { Q_UNUSED(widget); // 在这里执行 UI 或模型更新 } }; void demo(QWidget *target) { SubjectWidgetModule subject; MyObserver observer; observer.bind(subject, target); subject.notify(); observer.unbind(); }6. 互斥控件场景示例#include modules/observer_module/observer_module.h using namespace observer_module; class MyExclusiveController : public IExclusiveWidgetController { public: void disableWidgets() override { // 通知前禁用控件 } void enableWidgets() override { // 通知后恢复控件 } }; void demoSync(QWidget *target) { MyExclusiveController controller; SyncByRegSubjectModule subject(controller); quint32 id subject.addObserver( target, [](QWidget *widget, void *context) { Q_UNUSED(context); Q_UNUSED(widget); // 执行寄存器读取并刷新界面 }); subject.notify(); subject.removeObserver(id); }7. 与原项目类映射关系Subject_widget-SubjectWidgetModuleObserver_widget-ObserverWidgetModuleSubject_sync_ui_by_reg-SyncByRegSubjectModule8. 工程集成方式将以下文件加入.proSOURCES \ modules/observer_module/observer_module.cpp HEADERS \ modules/observer_module/observer_module.h如需复用现有Exclusive_widget_mgr可增加一个适配器class ExclusiveWidgetMgrAdapter : public observer_module::IExclusiveWidgetController { public: explicit ExclusiveWidgetMgrAdapter(Exclusive_widget_mgr *mgr) : mgr_(mgr) {} void disableWidgets() override { if (mgr_) { mgr_-disable_exclusive_widgets(); } } void enableWidgets() override { if (mgr_) { mgr_-enable_exclusive_widgets(); } } private: Exclusive_widget_mgr *mgr_ nullptr; };9. 适用场景与收益适用场景多个控件同步同一数据源定时刷新 UI一处状态变化触发多处联动更新收益降低模块耦合度提升可维护性和可测试性统一通知流程减少重复代码