码迷,mamicode.com
首页 > 其他好文 > 详细

观察者模式 Observer

时间:2015-05-26 00:16:06      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:

1、HeadFirst上的标准实现,属于教学版

接口声明:  

/* 说明:

 报纸出版社 + 订阅者 = 观察者模式 

 定义:
 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

 设计原则:
 为了交互对象之间的松耦合设计而努力。
*/

/**
*  观察者,即订阅者
*/
class Observer
{
public:
    virtual void Update(float temperature, float humidity, float pressure) = 0;
};

/**
*  主题,相当于出版社
*/
class Subject
{
public:
    virtual void RegisterObserver(Observer *observer) = 0;
    virtual void RemoveObserver(Observer *observer) = 0;
    virtual void NotifyObserver() = 0;
};

 

类实现:

#include <iostream>
#include <list>

#include "main.h"


class WeatherData : public Subject
{
public:

    WeatherData(float temperature=0float humidity=0float pressure=0) : _temperature(temperature)
                                                                         , _humidity(humidity)
                                                                         , _pressure(pressure)
    {}

    virtual void RegisterObserver(Observer *observer)
    {
        _observerList.push_back(observer);
    }
    virtual void RemoveObserver(Observer *observer)
    {
        _observerList.remove(observer);
    }
    /* 主动推送新数据 */
    virtual void NotifyObserver()
    {
        std::list<Observer*>::iterator it = _observerList.begin();
        for (; it != _observerList.end(); ++it)
        {
            (*it)->Update(_temperature, _humidity, _pressure);
        }
    }

    void SetData(float temperature, float humidity, float pressure)
    {
        _temperature = temperature;
        _humidity    = humidity;
        _pressure    = pressure;
        MeasurementsChanged();
    }
    void MeasurementsChanged()
    {
        NotifyObserver();
    }

    /* 提供轮询接口,不推介使用 */
    float GetTemperature()  { return _temperature; }  
    float GetHumidity()  { return _humidity; }
    float GetPressure()  { return _pressure; }

private:
    std::list<Observer*> _observerList;
    float _temperature;
    float _humidity;
    float _pressure;
};

class CurrentConditionDisplay : public Observer
{
public:
    CurrentConditionDisplay(Subject *weatherData) : _weatherData(weatherData)
    {
        _weatherData->RegisterObserver(this);
    }

    virtual void Update(float temperature, float humidity, float pressure)
    {
        Display(temperature, humidity, pressure);
    }
    virtual void Display(float temperature, float humidity, float pressure)
    {
        std::cout << "Current Condition : " << temperature << " degrees, " << humidity << "% humidity, " << pressure << " pa ." << std::endl;
    }

private:
    Subject *_weatherData;
};
//  class StatisticsDisplay : public Observer, public DisplayElement {};
//  class ForecastDisplay   : public Observer, public DisplayElement {};

int main()
{
    WeatherData weatheData;
    CurrentConditionDisplay currDisplay(&weatheData);
    weatheData.SetData(23101);

    return 0;
}

 

2、参考Java内置实现

1)将公共部分放入基类中(在Observable中管理观察者)。

2)告知观察者数据已更新,然后由观察者主动获取自己需要的数据。

 

接口声明:

 

类实现:

 

观察者模式 Observer

标签:

原文地址:http://www.cnblogs.com/ant-wjf/p/4529270.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!