观察者模式应该说比较简单,就是将不同观察者注册到被观察者内部,被观察者做了什么动作,都会通知到观察者。。。
代码中,被观察者也可以形成接口,有不同的子类,被观察,更灵活一些。。。
下面代码
- // Observer.cpp : 定义控制台应用程序的入口点。
- //************************************************************************/
- /* @filename Observer.cpp
- @author wallwind
- @createtime 2012/11/2 23:58
- @function 观察者模式
- @email wochenglin@qq.com
- @weibo @成林有理想
- */
- /************************************************************************/
- #include "stdafx.h"
- #include <iostream>
- #include <vector>
- using namespace std;
- /*
- 观察者
- */
- class IObserver
- {
- public:
- IObserver(){}
- virtual ~IObserver(){}
- virtual void update() = 0;
- };
- /*
- 观察者1;
- */
- class FirstObserver :public IObserver
- {
- public:
- FirstObserver(){}
- virtual ~FirstObserver(){}
- virtual void update()
- {
- cout<<"FirstObserver KNOW OBSERVERABLE DO ACTION" <<endl;
- }
- };
- class SecondObserver :public IObserver
- {
- public:
- SecondObserver(){}
- virtual ~SecondObserver(){}
- virtual void update()
- {
- cout<<"SecondObserver KNOW OBSERVERABLE DO ACTION" <<endl;
- }
- };
- /**
- 被观察者
- */
- class Observable
- {
- public:
- Observable()
- {
- }
- ~Observable()
- {
- }
- void addObser(IObserver* obser)
- {
- m_obserSet.push_back(obser);
- }
- void removeObser(IObserver* obser)
- {
- m_obserSet.pop_back();
- }
- void doAction()
- {
- cout<<"Observable do some action " <<endl;
- this->notifyAllObser();
- }
- void notifyAllObser()
- {
- vector< IObserver* > ::iterator iter = m_obserSet.begin();
- for (;iter !=m_obserSet.end();iter++)
- {
- (*iter)->update();
- }
- }
- private:
- vector< IObserver* > m_obserSet;
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- IObserver * fober = new FirstObserver();
- IObserver * sober = new SecondObserver();
- Observable * oble = new Observable;
- oble->addObser(fober);
- oble->addObser(sober);
- oble->doAction();
- return 0;
- }