/*当调用concreatesubject 的setsate方法后concreateobserver 中state 也会同步更新
观察者模式
用于MVC 模式中M :Model ---> 目标的基类
V : View -----> 观察者的基类
*/
#include <vector>
using std::vector;
class observer
{
friend class subject;
public :
virtual ~observer(){}
virtual void update(subject *obj) =0; //纯虚函数 更新接口
protected :
observer(){} //注意:构造和析构函数没有在类外去具体实现,在此就要用 {}
};
class subject //目标
{
friend class observer;
public:
vector<observer*> mobserver;
virtual attach(observer *o) //这里传的只能是指针,observer 是抽象类,无法实例化
{
mobserver.push_back(o);
}
#if 0
virtual detach(observer *o)
{
//find o;
mobserver.pop(o); //vector 没有pop 操作
}
#endif
public:
virtual notify()
{
//vector<observer*>::iterator it=NULL;
for(vector<observer*>::iterator it=mobserver.begin();it!=mobserver.end();it++)
(*it)->update(this);//通知观察者更新
}
};
class concreatesubject : public subject
{
private:
int state;
public:
void setstate(int s)
{
if(state!=s)
{
state=s;
notify();// 最终调用concreateobserver 类的update(concreatesubject )
}
}
int getstate()
{
return state;
}
};
class concreateobserver :public observer
{
private:
int state; //观察者的状态也会得到更新
public:
concreatesubject *sub;
concreateobserver(concreatesubject *s):sub(s)
{
sub->attach(this);
}
void update(subject *obj)
{
//state=obj->getstate();
if(obj==sub)
draw();
}
void draw()
{
state=sub->getstate();
std::cout<<state<<std::endl;
}
};