观察者模式

本文介绍了一种使用C++实现的观察者模式,该模式通过Subject和Observer类定义了一对多的关系,允许WeatherData类在状态发生变化时通知其注册的所有观察者进行更新。文章提供了具体的代码实现,包括如何注册和移除观察者以及更新显示元素。

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

#ifndef SUBJECT_H
#define SUBJECT_H

#include "Observer.h"

class Subject
{
public:
    virtual void registerObserver( Observer* o) = 0;
    virtual void removeObserver( Observer* o) = 0;
    virtual void notifyObservers() = 0;
};

#endif
Subject.h
#ifndef WEATHERDATA_H
#define WEATHERDATA_H

#include "Subject.h"
#include "Observer.h"
#include <list>

using namespace std;

class WeatherData : public Subject
{
public:
    WeatherData (double temp = 0, double hum = 0, double pre = 0) : temperature(temp), humidity(hum), pressure(pre){};
    void registerObserver( Observer* o ) 
    {
        observers.push_back (o);
    }
    void removeObserver( Observer* o )
    {
        observers.remove(o);
    }
    void notifyObservers()
    {
        for (list<Observer*>::iterator itr = observers.begin(); itr != observers.end(); ++itr)
        {
            (*itr)->update(temperature, humidity, pressure);
        }
    }
    void measurementsChanged()
    {
        notifyObservers();
    }
    void setMeasurements(double temperature, double humidity, double pressure)
    {
        this->temperature = temperature;
        this->humidity = humidity;
        this->pressure = pressure;
        measurementsChanged();
    }
private:
    list<Observer*> observers;
    double temperature;
    double humidity;
    double pressure;
};

#endif
WeatherData.h
#ifndef OBSERVER_H
#define OBSERVER_H

class Observer
{
public:
    virtual void update(double temp, double humidity, double pressure) = 0;
};

#endif
Observer.h
#ifndef STATISTICSDISPLAY_H
#define STATISTICSDISPLAY_H

#include "Observer.h"
#include "DisplayElement.h"
#include "WeatherData.h"
#include <iostream>

using namespace std;

class  StatisticsDisplay : public Observer, DisplayElement
{
public:
    StatisticsDisplay (Subject* weatherData, double pre = 0) : pressure(pre)
    {
        this->weatherdata = weatherData;
        weatherData->registerObserver(this);
    }
    virtual ~StatisticsDisplay()
    {
        weatherdata->removeObserver(this);
    }
    void update (double temp, double hum, double pre)
    {
        pressure = pre;
        display();
    }
    void display()
    {
        cout<<"Statistics: "<<pressure <<endl;
    }
private:
    Subject* weatherdata;
    double pressure;
};

#endif
StatisticsDisplay.h
#ifndef CURRENTCONDITIONSDISPLAY_H
#define CURRENTCONDITIONSDISPLAY_H

#include "Observer.h"
#include "DisplayElement.h"
#include "WeatherData.h"
#include <iostream>

using namespace std;

class  CurrentConditionsDisplay : public Observer, DisplayElement
{
public:
    CurrentConditionsDisplay (Subject* weatherData, double temp = 0, double hum = 0) : temperature(temp), humidity(hum)
    {
        this->weatherdata = weatherData;
        weatherData->registerObserver(this);
    }
    virtual ~CurrentConditionsDisplay()
    {
        weatherdata->removeObserver(this);
    }
    void update (double temp, double hum, double pre)
    {
        temperature = temp;
        humidity = hum;
        display();
    }
    void display()
    {
        cout<<"Current conditions: "<<temperature <<","<<humidity<<endl;
    }
private:
    Subject* weatherdata;
    double temperature;
    double humidity;
};

//#endif
CurrentConditionsDisplay.h
#ifndef DISPLAYELEMENT_H
#define DISPLAYELEMENT_H

class DisplayElement
{
public:
    virtual void display() = 0;
};

#endif
DisplayElement
#include "WeatherData.h"
#include "StatisticsDisplay.h"
#include "CurrentConditionsDisplay.h"

int main()
{
    WeatherData weatherdata;
    StatisticsDisplay stadisp( &weatherdata );
    CurrentConditionsDisplay currdisp( &weatherdata );;
    weatherdata.setMeasurements(1,2,3);
    return 1;
}
main.cpp

 

转载于:https://www.cnblogs.com/lisiyuannnn/p/4744709.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值