您的位置:首页 > 编程语言 > C语言/C++

C++实现观察者模式

2013-02-01 11:45 239 查看
刚刚在csdn看到某位博主关于观察者模式的讲解,感觉很好,于是照葫芦画瓢简单实现了下观察者模式。

此博主关于 气象站 的故事例子及设计模式和设计原则的讲解深入浅出,通俗易懂我就不再废话了....  

读者先看看这  http://blog.csdn.net/xuzhonghai/article/details/7239981, 然后可以参考下面本人C++

简单实现的代码和注释:

#include <iostream>

using namespace std;

#include <vector>

#define  PERROR(a)  (cout<<a<<endl)

/*气象环境监控系统-- 观察者模式实现*/

//观察者基类

class Observer 

{

   public:

     virtual void update(float temperture, float humidity, float pressure) = 0; 

     virtual void display(ostream &os) = 0;

};

//被观察者基类

class Observed

{

public:

  virtual void addObserver(Observer &) = 0; //维护观察者列表,增加观察者

  virtual void removeObserver(Observer &) = 0;//维护观察者l列表,删除观察者

  virtual void notifyObserver() = 0;//给所有观察者发送消息

  virtual void setMeasurements(float temperture, float humidity, float pressure) = 0;

};

/*************以上都是观察者和被观察者基类接口的定义,  下面是具体实现类*********************************/

//被观察的气象数据 类继承被观察者基类

class WeatherData:public Observed

{

   public:

     WeatherData(){

          this->temperture = 0;
          this->humidity = 0;
          this->pressure = 0;
          this->iter = m_vector.begin();

     }

   virtual void addObserver(Observer &o) //维护观察者列表,增加观察者

   { 

       m_vector.push_back(&o);

   }

   virtual void removeObserver(Observer &o)//维护观察者,删除观察者

   { //  ...

   }

   virtual void notifyObserver()//给所有观察者发送消息

   {

       for(iter = m_vector.begin(); iter != m_vector.end(); ++iter){

          (*iter)->update(temperture, humidity, pressure);

      }

   }

   //天气信息改变 自动触发measurementsChange()

   void setMeasurements(float temperture, float humidity, float pressure)

   {

       this->temperture = temperture;

       this->humidity = humidity;

       this->pressure = pressure;

       this->iter = m_vector.begin();

       measurementsChange();

   }

   //检测所有信息的改变 并告诉所有观察者

   void measurementsChange()

   {

       this->notifyObserver();

   }

   

   private:

     vector<Observer*>  m_vector;//所有观察者列表  注意不要给vector的模板类型为Observer的对象类型,用其指针类型,因为Observer为抽象类

     vector<Observer*>::iterator iter;

     float temperture; //温度

     float humidity;   //湿度

     float pressure;   //气压

};

//具体的观察者类  天气环境状况显示类 

class  CurrentConditionsDisplay: public Observer

{  

  public:

     //CurrentConditionsDisplay(){}

     CurrentConditionsDisplay(Observed &weatherdata)

     {

       this->weatherdata = &weatherdata;

       this->weatherdata->addObserver(*this);

     }

     void update(float temperture, float humidity, float pressure)

     {

        PERROR("--------start update---------");

        this->temperture = temperture;

        this->humidity = humidity;
        this->pressure = pressure;
       //PERROR("end update ...");

     }

     void display(ostream &os)

    {

           os<<" 温度: "
           <<this->temperture<<"'c  湿度: "
          <<this->humidity     <<"%  气压: "
          <<pressure<<"Pa"<<endl<<endl;

     }

  private:

     float temperture;

     float humidity;

     float pressure;

     Observed *weatherdata;//注意这里不要用Observed的对象,而用其对像的指针, 因为Observed定义为的是一个抽象类

};

//测试程序

int main(void)

{

   //WeatherData  *weatherdata = new WeatherData;

   //CurrentConditionsDisplay *showconditions = new CurrentConditionsDisplay(*weatherdata);

   Observed  *weatherdata = new WeatherData;

   Observer  *showconditions = new CurrentConditionsDisplay(*weatherdata);

 

   weatherdata->setMeasurements(8.0, 25, 1000);

   showconditions->display(cout);

   

   weatherdata->setMeasurements(10.7, 26.3, 1200);

   showconditions->display(cout);

   weatherdata->setMeasurements(20.7, 24.3, 1150);

   showconditions->display(cout);

   delete weatherdata;

   delete showconditions;

   

   return 0;

}

运行结果截图:

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: