`

观察者(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 Pattern) 1. 什么是观察者模式? 2. 为什么需要观察者模式? 3. 观察者模式的核心概念 4. 观察者模式的结构 5. 观察者模式的基本实现 简单的气象站示例

    观察者模式(Observer Pattern) 1. 什么是观察者模式? 2. 为什么需要观察者模式? 3. 观察者模式的核心概念 4. 观察者模式的结构 5. 观察者模式的基本实现 简单的气象站示例 6. 观察者模式的进阶实现 推模型 vs 拉...

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

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

    观察者模式Observer

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

    观察者模式,Observer

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

    Observer模式

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

    观察者模式(Observer)

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

    observer观察者模式

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

    OBserver模式设计实现

    标题中的"OBserver模式设计实现"是指探讨如何在实际编程中应用观察者模式,无论是用Java还是C++。Head First系列书籍是著名的编程学习资源,以易懂的方式解释复杂的设计模式。在描述中提到的"Head First模式设计用的...

    观察者模式(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)和被观察者...

Global site tag (gtag.js) - Google Analytics