`

观察者(Observer)模式

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

松耦合:两个对象松耦合时,它们依然可以交互,但并不太清楚彼此的细节,相互依赖很低,这样可以建立有弹性的OO系统,应对变化.

要点:
1.观察者模式定义了对象之间一对多的关系
2.主题用一个共同的接口来更新观察者
3.观察者和可观察者之间用松耦合结合,可观察者不知道观察者的细节,只知道观察者实现了
观察者接口
4.使用此模式时,你可从被观察者处推或拉数据(推的方式被认为更“正确”)
5.有多个观察者时,不可以依赖特定的通知次序

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




主题接口:Subject.h
#ifndef SUBJECT_H
#define SUBJECT_H
#include"Observer.h"

class Subject{
public:
    virtual void registerObserver(Observer* obs)=0;//增加
    virtual void removeObserver(Observer* obs)=0;//删除
    virtual void notifyObserver()=0;//通知观察者准备更新
};

#endif // SUBJECT_H



观察者接口:Observer.h
#ifndef OBSERVER_H
#define OBSERVER_H

class Observer{
public:
    virtual void update(float t,float p=0,float=0)=0;//更新全部数据
    virtual void update()=0;//只更新自己需要的数据
    virtual void display()=0;
};

#endif // OBSERVER_H



主题实例:
weatherData.h
#ifndef WEATHERDATA_H
#define WEATHERDATA_H

#include"Subject.h"
#include<list>
using namespace std;

class WeatherData:public Subject{
private:
    list<Observer*> mObsList;
    float mTemperature;
    float mHumidity;
    float mPressure;
    bool mChange;//增加一个变量,以备不时之需,比如当数据发生微小变化时不改更新
public:
    explicit WeatherData(float t=0,float h=0,float p=0);
    void registerObserver(Observer* obs);
    void removeObserver(Observer* obs);
    void notifyObserver();
    void setMeasurement(float t,float h,float p);
    void measurementChanged();
    float getTemperature()const;
    float getHumidity()const;
    float getPressure()const;
    bool getChanged()const;
    void setChanged(bool c);
};

#endif // WEATHERDATA_H



weatherData.cpp
#include"WeatherData.h"

WeatherData::WeatherData(float t, float h, float p)
    :mTemperature(t),mHumidity(h),mPressure(p){

}

void WeatherData::registerObserver(Observer *obs){
    mObsList.push_back(obs);
}

void WeatherData::removeObserver(Observer *obs){
    mObsList.remove(obs);
}

void WeatherData::notifyObserver(){
    list<Observer*>::iterator iter = mObsList.begin();
    while(iter!=mObsList.end()){
        //(*iter)->update();//拉数据
        (*iter)->update(mTemperature,mHumidity,mPressure);//推送数据
        ++iter;
    }
}

/*
  TODO:这里可以利用change来灵活的更新信息
  */
void WeatherData::setMeasurement(float t, float h, float p){
    mTemperature = t;
    mHumidity = h;
    mPressure = p;
    measurementChanged();
}

void WeatherData::measurementChanged(){
    notifyObserver();
}

void WeatherData::setChanged(bool c){
    mChange = c;
}

bool WeatherData::getChanged()const{
    return mChange;
}

/*
  支持主动接收数据
  */
float WeatherData::getTemperature()const{
    return mTemperature;
}

float WeatherData::getHumidity()const{
    return mHumidity;
}

float WeatherData::getPressure()const{
    return mPressure;
}



观察者实例:
CurrentTemperature.h
#ifndef CURRENTCONDITION_H
#define CURRENTCONDITION_H
#include"Observer.h"
#include"Subject.h"

class CurrentTemperature:public Observer{
private:
    float mTemperature;
    float mHumidity;
    float mPressure;
    Subject* mSub;
public:
    explicit CurrentTemperature(Subject* sub);
    void update(float t,float h=0,float p=0);
    void update();
    void display();
};

#endif



CurrentTemperature.cpp
#include"Observer.h"
#include"CurrentTemperature.h"
#include"WeatherData.h"
#include<iostream>
using namespace std;

CurrentTemperature::CurrentTemperature(Subject* sub){
    mSub = sub;//将Subject保存起来,为"拉"数据做准备
    sub->registerObserver(this);
}

/*
  我其实只要温度这一个数据,你干嘛把所有的信息都推送给我?
  我直接根据自身需求去取数据多好.
  有时候这很烦人,就好像3G用户喜欢把手机推送给关掉。
  */
void CurrentTemperature::update(){
    if(WeatherData *wd = dynamic_cast<WeatherData*>(mSub)){
        update(wd->getTemperature());
    }
}

/*
  但是你在构造的时候保存了我的指针,这意味着你们可以进来大肆挖掘
  我的数据,我不得不提供公开的getter(),但每次想得到的时候都来找我,
  你需要从我这多次getXXX(),这样多麻烦,而且像Statistic和Forecast
  他们可不想每次到我这拉数据,我直接把所有的数据都给你们都更新
  了,这样大部分观察者还是满意的多好!
  -----------推送数据被认为更“正确"----------------
  这样松耦合,观察者不需要持有主题对象的指针,
  就好像是“你不要找我拿信息,我会一有新信息就帮大家都更新!”
*/
void CurrentTemperature::update(float t, float h, float p){
    mTemperature = t;
    mHumidity = h;
    mPressure = p;
}

void CurrentTemperature::display(){
    cout << "current temperature is " << mTemperature;
}

int main(){
    WeatherData* wd = new WeatherData;
    Observer* obs = new CurrentTemperature(wd);
    wd->setMeasurement(30,20,10);
    obs->display();
}

current temperature is 30


  • 大小: 83.6 KB
分享到:
评论

相关推荐

    观察者模式相关

    观察者 Observer 模式定义:在对象之间定义了一对多的依赖关系 这样一来 当一个对象改变状态时 依赖它的对象都会收到通知并自动跟新 Java已经提供了对观察者Observer模式的默认实现 Java对观察者模式的支持主要体现...

    设计模式C++学习之观察者模式(Observer)

    观察者模式(Observer)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在C++中广泛应用,特别是在需要...

    设计模式之观察者模式(Observer Pattern)

    在观察者模式中,通常有两个主要角色:主题(Subject)和观察者(Observer)。主题是被观察的对象,它持有一个观察者列表,并负责通知这些观察者状态的变化。观察者是依赖主题的对象,当接收到主题的通知时,它们会...

    设计模式之观察者模式(Observer)

    观察者模式(Observer)是软件设计模式中的一种行为模式,其主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动...

    观察者模式Observer

    观察者模式(Observer)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在软件开发中广泛应用于事件处理和实时...

    观察者模式,Observer

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的系统或者...

    Observer模式

    5. **解耦合**:Observer模式通过定义一种松散耦合的关系,使得被观察者和观察者可以独立地进行工作。这提高了系统的可扩展性和可维护性。 在实际应用中,例如,当我们开发一个实时数据显示系统,可以将数据源作为...

    观察者模式(Observer)

    观察者模式(Observer)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态变化时通知多个“观察”该对象的其他对象。这个模式在软件工程中扮演着重要角色,尤其是在事件驱动编程和发布/订阅系统中。...

    observer观察者模式

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在软件工程中,这常用于实现事件驱动编程,使得系统能够及时响应变化。 在...

    观察者模式(Observer)

    观察者模式(Observer)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态变化时通知多个“观察”该对象的其他对象。这个模式在软件工程中广泛应用于事件驱动编程,例如用户界面组件的交互或者系统状态的...

    Observer 观察者模式 示例 源码 ----设计模式

    观察者模式 概述 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 适用性 1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。 将这二者封装...

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)

    **C#面向对象设计模式纵横谈(19)**:**观察者模式**(Observer Pattern)是行为型模式的一种,它在软件工程中扮演着至关重要的角色。观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...

    Observer观察者模式

    Observer观察者模式是一种...要深入了解Observer模式,你可以查看"src"目录下的代码,分析主题和观察者的实现,理解它们如何交互。同时,可以通过博文链接(已提供)来获取更多关于Observer模式的理论知识和实践指导。

    android Observer(观察者模式)_案例祥解.pdf

    观察者模式详解 观察者模式是23种设计模式中的一种,尤其是在软件设计过程中体现的更是立足无穷。本文将详细讲解观察者模式的概念和实现,通过代码注释来解释各个组件的作用。 一、观察者模式的定义 观察者模式是...

    观察者模式observer

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动编程或者...

    C++设计模式之观察者模式(Observer)

    观察者模式通常的叫法叫做订阅-发布模式,类似于报刊杂志的订阅,观察者和被观察者就是读者和邮局的关系,读者先要在邮局订阅想要的报刊,当报刊发行时,邮局会将报刊邮寄到读者家里。观察者(Observer)和被观察者...

    [行为模式]head first 设计模式之观察者模式(observer)

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在软件开发中广泛应用于事件驱动...

    (行为型模式) Observer 观察者模式

    #### .NET框架中的Observer模式 在.NET框架中,观察者模式通常通过事件(Event)机制来实现。事件机制提供了发布/订阅模型,使得对象间的耦合程度大大降低。在这个模型中: - **事件(Event)**:代表了一个可以被...

Global site tag (gtag.js) - Google Analytics