现在的位置: 首页 > 综合 > 正文

观察者模式

2014年01月05日 ⁄ 综合 ⁄ 共 1290字 ⁄ 字号 评论关闭

/*当调用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;
 }
};

抱歉!评论已关闭.