观察者模式的使用
最近项目涉及到一些焦点变化的处理,有些嵌套很深,做起来真心!@#¥%……&
观察者模式主要是使用一种“注册——通知——撤销注册”的形式,Qt的事件处理有个“继承QApplication并重新实现notify()函数“的方式,这个可以获得所有的event事件,我关心的是焦点变化,需要定义一个接口,所有代码实现:
class ICaptureHandler { public: //处理焦点变化事件 virtual void HandleCaptureChanged(MSG * pMsg) = 0; };
class CCapturerManager : public QObject { Q_OBJECT public: CCapturerManager(QObject *parent); ~CCapturerManager(); static void Attach(ICaptureHandler* pObs); //注册观察者 static void Detach(ICaptureHandler* pObs); //注销观察者 static void DetachAll(); //注销所有观察者 static void Notify(MSG* pArg = nullptr); //若状态变化,则遍历观察者,逐个通知更新 static QMutex m_Mutex; static QSet<ICaptureHandler*> m_setObs; //set保证目标唯一 };
QSet<ICaptureHandler*> CCapturerManager::m_setObs = QSet<ICaptureHandler*>(); QMutex CCapturerManager::m_Mutex; CCapturerManager::CCapturerManager(QObject *parent) : QObject(parent) { } CCapturerManager::~CCapturerManager() { } void CCapturerManager::Attach(ICaptureHandler* pObs) { if (!pObs) return; QMutexLocker locker(&m_Mutex); m_setObs.insert(pObs); } void CCapturerManager::Detach(ICaptureHandler* pObs) { if (!pObs) return; QMutexLocker locker(&m_Mutex); m_setObs.remove(pObs); } void CCapturerManager::DetachAll() { QMutexLocker locker(&m_Mutex); m_setObs.clear(); } void CCapturerManager::Notify(MSG* pArg /* = NULL */) { qDebug() << "CCapturerManager::Notify " << m_setObs.count() << "\n"; QMutexLocker locker(&m_Mutex); QSet<ICaptureHandler*>::iterator itr = m_setObs.begin(); for (; itr != m_setObs.end(); itr++) { (*itr)->HandleCaptureChanged(pArg); } }
在需要用到的地方实现接口并注册。ok,就这样