观察者模式是最常用的设计模式之一,在此模式中,一个目标对象管理依赖它的观察对象,并在自身状态发生改变的时候主动通知所有注册的观察者对象。观察者模式常被用作设计事件处理系统。
例如下面的示例代码是常见的观察者模式的示例,在此用c++进行实现。猫作为目标物件 管理两个观察者,一个是主人,一个是老鼠。当猫叫这个事件发生时能够调用观察者相应的响应函数,从而做出相应的反应。
通过观察者模式可以优化程序的业务逻辑,实现松耦合、易维护。
下载示例代码(VC6下编译通过): ObserverSample.rar
//-------------代码示例-------------
#include <list>
#include <iostream>
using namespace std;
class CObserver;
class CSubject
{
protected:
CSubject(){m_obsList=new list<CObserver*>;};
private:
list<CObserver*>* m_obsList;
public:
virtual attach(CObserver* pObs);
virtual detach(CObserver* pObs);
virtual notify();
virtual action()=0;
};
class CCat:public CSubject
{
public:
void Cry();
virtual action(){Cry();};
};
class CObserver
{
protected:
CObserver();
virtual ~CObserver();
public:
virtual void Response()=0;
};
class CMaster:public CObserver
{
public:
CMaster(CSubject* pSubject);
virtual void Response();
protected:
CSubject* m_pSubject;
};
class CMouse:public CObserver
{
public:
CMouse(CSubject* pSubject);
virtual void Response();
protected:
CSubject* m_pSubject;
};
// 实现
CObserver::CObserver()
{
}
CObserver::~CObserver()
{
}
void CMaster::Response()
{
cout<<"the master wakeup"<<endl;
}
CMaster::CMaster( CSubject* pSubject )
{
cout<<"master is created..."<<endl;
m_pSubject=pSubject;
pSubject->attach(this);
}
void CMouse::Response()
{
cout<<"the mouse run away..."<<endl;
}
CMouse::CMouse( CSubject* pSubject )
{
cout<<"master is created..."<<endl;
m_pSubject=pSubject;
pSubject->attach(this);
}
CSubject::attach( CObserver* pObs )
{
m_obsList->push_front(pObs);
}
CSubject::detach( CObserver* pObs )
{
if (pObs)
{
m_obsList->remove(pObs);
}
}
CSubject::notify()
{
list<CObserver*>::iterator it;
it=m_obsList->begin();
for (;it!=m_obsList->end();it++)
{
(*it)->Response();
}
}
void CCat::Cry()
{
cout<<"the cat cry..."<<endl;
this->notify();
}