C++实现观察者模式


刚刚在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;
}


运行结果截图:

 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值