观察者模式应该说比较简单,就是将不同观察者注册到被观察者内部,被观察者做了什么动作,都会通知到被观察者。。。
代码中,被观察者也可以形成接口,有不同的子类,被观察,更灵活一些。。。
下面代码
// 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;
}
在类设计上可以更加灵活。
更多文章,欢迎访问:http://blog.csdn.net/wallwind