观察者模式也叫监听者模式,在实际项目开发中,用的最多的设计模式之一。
其适用场合是:当一个事物的状态改变时,需要通知依赖它的事物更新。实际上,这种交互也称发布~订阅,是一种一对多的依赖关系。在实际使用中,也经常将其单独抽出来,将其设计为模板化形式,这样就可以减少项目中各自实现,导致重复代码增多。例如:
#ifndef CLISTENABLE_H_
#define CLISTENABLE_H_
#include <list>
#include <algorithm>
// 可监听的模板类
template <class T>
class cListenable
{
public:
cListenable();
virtual ~cListenable();
void RegisterListener(T *pListener); // 绑定监听者
void UnregisterListener(T *pListener); // 分离监听者
protected:
typedef std::list<T*> Listeners;
Listeners m_Listeners; // 监听列表
};
template <class T>
cListenable<T>::cListenable()
{
}
template <class T>
cListenable<T>::~cListenable()
{
}
template <class T>
void cListenable<T>::RegisterListener(T *pListener)
{
ASSERT(NULL != pListener);
if (std::find(m_Listeners.begin(), m_Listeners.end(), pListener) == m_Listeners.end())
{
m_Listeners.push_back(pListener);
}
}
template <class T>
void cListenable<T>::UnregisterListener(T *pListener)
{
ASSERT(NULL != pListener);
Listeners::iterator i = std::find(m_Listeners.begin(), m_Listeners.end(), pListener);
if (i != m_Listeners.end())
{
m_Listeners.erase(i);
}
}
#endif