这个观察者模式实现的特点是使用模板类,将使用是的派生和继承 转变成类成员函数指针,使应用上很便利。
//h文件
class QObServer
{
public:
virtual void OnNotify(const QVariantList &datalist) = 0;
};
class QSubject
{
typedef QList<QObServer*> QObServerList;
public:
static QSubject * instance();
void attach(QObServer * obs);
void detach(QObServer * obs);
void notify(const QVariant &arg0, const QVariant &arg1);
private:
QObServerList m_ls;
};
template <typename T>
class QObServerT : public QObServer
{
typedef void (T::*FUNC)(const QVariantList &datalist);
public:
QObServerT(T * obj,FUNC func):m_obj(obj),m_func(func)
{
QSubject::instance()->attach(this);
}
~QObServerT()
{
QSubject::instance()->detach(this);
}
virtual void OnNotify(const QVariantList &datalist)
{
if(m_obj && m_func)
{
(m_obj->*m_func)(datalist);
}
}
private:
T * m_obj;
FUNC m_func;
};
class QObServer
{
public:
virtual void OnNotify(const QVariantList &datalist) = 0;
};
class QSubject
{
typedef QList<QObServer*> QObServerList;
public:
static QSubject * instance();
void attach(QObServer * obs);
void detach(QObServer * obs);
void notify(const QVariant &arg0, const QVariant &arg1);
private:
QObServerList m_ls;
};
template <typename T>
class QObServerT : public QObServer
{
typedef void (T::*FUNC)(const QVariantList &datalist);
public:
QObServerT(T * obj,FUNC func):m_obj(obj),m_func(func)
{
QSubject::instance()->attach(this);
}
~QObServerT()
{
QSubject::instance()->detach(this);
}
virtual void OnNotify(const QVariantList &datalist)
{
if(m_obj && m_func)
{
(m_obj->*m_func)(datalist);
}
}
private:
T * m_obj;
FUNC m_func;
};
//cpp文件
QSubject * QSubject::instance()
{
static QSubject _instance;
return &_instance;
}
void QSubject::attach(QObServer * obs)
{
m_ls.append(obs);
}
void QSubject::detach(QObServer * obs)
{
m_ls.removeAll(obs);
}
void QSubject::notify(const QVariant &arg0, const QVariant &arg1)
{
QVariantList ls;
ls <<arg0 << arg1;
QObServerList::iterator it = m_ls.begin();
for(; it != m_ls.end(); ++it)
{
(*it)->OnNotify(ls);
}
}
{
static QSubject _instance;
return &_instance;
}
void QSubject::attach(QObServer * obs)
{
m_ls.append(obs);
}
void QSubject::detach(QObServer * obs)
{
m_ls.removeAll(obs);
}
void QSubject::notify(const QVariant &arg0, const QVariant &arg1)
{
QVariantList ls;
ls <<arg0 << arg1;
QObServerList::iterator it = m_ls.begin();
for(; it != m_ls.end(); ++it)
{
(*it)->OnNotify(ls);
}
}