zoukankan      html  css  js  c++  java
  • 观察者模式的使用

      最近项目涉及到一些焦点变化的处理,有些嵌套很深,做起来真心!@#¥%……&

      观察者模式主要是使用一种“注册——通知——撤销注册”的形式,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() << "
    ";
    
        QMutexLocker locker(&m_Mutex);
        QSet<ICaptureHandler*>::iterator itr = m_setObs.begin();
        for (; itr != m_setObs.end(); itr++)
        {
            (*itr)->HandleCaptureChanged(pArg);
        }
    }

    在需要用到的地方实现接口并注册。ok,就这样

  • 相关阅读:
    vue2.5.2 在ie11打开空白的解决方法
    小程序自定义组件中observer函数的应用
    小程序将一个完整项目导入,报错ENOENT: no such file or directory(game.json)
    企业微信应用开发前准备
    jquery转盘抽奖游戏
    小程序路由跳转携带参数方法(直接跳转、事件委托跳转)
    小程序定义并使用模板template
    小程序真机预览,提示“音乐文件错误,播放失败”
    Java反编译
    DataX
  • 原文地址:https://www.cnblogs.com/qnkk123/p/9389299.html
Copyright © 2011-2022 走看看