观察者模式的使用

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

  观察者模式主要是使用一种“注册——通知——撤销注册”的形式,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,就这样

posted @ 2018-07-30 10:38  积跬步,到千里  阅读(206)  评论(0编辑  收藏  举报