【设计模式】Head First 设计模式——观察者模式 C++实现

这篇具有很好参考价值的文章主要介绍了【设计模式】Head First 设计模式——观察者模式 C++实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

设计模式最大的作用就是在变化和稳定中间寻找隔离点,然后分离它们,从而管理变化。将变化像小兔子一样关到笼子里,让它在笼子里随便跳,而不至于跳出来把你整个房间给污染掉。

设计思想

主题对象(出版者)管理某些数据,当主题内的数据改变,就会通知观察者(订阅者)。

观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。相比让多个对象控制同一份数据,可以得到更干净的OO设计。

业务场景

假定现在有一个气象站类,这个气象站类会不定时更新温度,湿度,气压的最新数据,要求你在这些数值变化时,立即通知一些气象局进行展示,而他们得到的数据是一样的,但是采用的展示手段可能是不一样的,比如有的采用图示,有的采用文字,有的采用语音播报等,给出设计代码。文章来源地址https://www.toymoban.com/news/detail-692454.html

代码案例

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 观察者抽象类
class Observer
{
public:
    virtual void update(const float tmp, const float hum, const float pre) = 0;
    virtual ~Observer() {}
};

// 展示抽象类
class Display
{
public:
    virtual void display() const = 0;
    virtual ~Display() {}
};

// 主题抽象类
class Subject
{
public:
    virtual void registerObserver(Observer* b) = 0;
    virtual void removeObserver(Observer* b)   = 0;
    virtual void notifyObserver() const        = 0;
    virtual ~Subject() {}
};

class WeatherData : public Subject
{
private:
    std::vector<Observer*> observers;
    float                  temperature = 0;
    float                  humidity    = 0;
    float                  pressure    = 0;

public:
    WeatherData() : Subject() {}

    void registerObserver(Observer* b)
    {
        observers.push_back(b);
    }

    void removeObserver(Observer* ob)
    {
        auto it = find(observers.begin(), observers.end(), ob);
        if (it != observers.end())
        {
            observers.erase(it);
        }
    }
    // 通知观察者,使得所有观察者更新信息。
    void notifyObserver() const
    {
        for (auto& it : observers)
        {
            it->update(temperature, humidity, pressure);
        }
    }

    void measurementsChanged()
    {
        notifyObserver();
    }

    // 设置气象站天气信息并通知观察者。
    void setMeasurements(const float tmp, const float hum, const float pre)
    {
        temperature = tmp;
        humidity    = hum;
        pressure    = pre;
        measurementsChanged();
    }

    ~WeatherData()
    {
        for (auto& each : observers)
        {
            delete each;
            each = nullptr;
        }
    }
};

class CurrentConditionsDisplay : public Observer, public Display
{
private:
    float    temperature = 0;
    float    humidity    = 0;
    Subject* weatherData = nullptr;

public:
    // 初始化信息板,并在气象站对其登记。
    CurrentConditionsDisplay(Subject* wd) : Observer(), Display()
    {
        weatherData = wd;
        weatherData->registerObserver(this);
    }
    // 更新天气信息并展示。
    void update(const float tmp, const float hum, const float pre)
    {
        temperature = tmp;
        humidity    = hum;
        display();
    }

    void display() const
    {
        cout << "气象局1: 当前温度:" << temperature << ", 当前湿度:" << humidity << endl;
    }

    ~CurrentConditionsDisplay()
    {
        if (weatherData)
        {
            delete weatherData;
            weatherData = nullptr;
        }
    }
};

class CurrentConditionsDisplay2 : public Observer, public Display
{
private:
    float    temperature = 0;
    float    humidity    = 0;
    Subject* weatherData = nullptr;

public:
    // 初始化信息板,并在气象站对其登记。
    CurrentConditionsDisplay2(Subject* wd) : Observer(), Display()
    {
        weatherData = wd;
        weatherData->registerObserver(this);
    }
    // 更新天气信息并展示。
    void update(const float tmp, const float hum, const float pre)
    {
        temperature = tmp;
        humidity    = hum;
        display();
    }

    void display() const
    {
        cout << "气象局2: 当前温度:" << temperature << ", 当前湿度:" << humidity << endl;
    }

    ~CurrentConditionsDisplay2()
    {
        if (weatherData)
        {
            delete weatherData;
            weatherData = nullptr;
        }
    }
};

int main()
{
    WeatherData*               wd  = new WeatherData();
    CurrentConditionsDisplay*  cd  = new CurrentConditionsDisplay(wd);
    CurrentConditionsDisplay2* cd2 = new CurrentConditionsDisplay2(wd);

    // wd修改天气信息 并通知展示板
    wd->setMeasurements(80, 65, 30.4f);
    wd->setMeasurements(60, 35, 32.1f);
    wd->removeObserver(cd);
    cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
    wd->setMeasurements(60, 35, 31.1f);

    return 0;
}

到了这里,关于【设计模式】Head First 设计模式——观察者模式 C++实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式-观察者模式

    观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者

    2024年02月15日
    浏览(43)
  • 设计模式---观察者模式

    1,概念         属于行为模式的一种,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一对象主题对象,这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。 在观察者模式中有如下角色: Subject:抽象主题(抽象被观察者),

    2024年02月15日
    浏览(50)
  • 设计模式——14. 观察者模式

    观察者模式(Observer Pattern)是一种行为型设计模式,用于定义对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都能够自动收到通知并更新自己的状态,以保持与被观察对象的同步。观察者模式也被称为发布-订阅模式。 观察者模式包含以

    2024年02月07日
    浏览(35)
  • 设计模式之观察者模式

    可以帮你的对象知悉现况,不会错过该对象感兴趣的事。对象甚至在运行时可决定是否要继续被通知。 从报纸和杂志的订阅说起: 报社的业务就是出版报纸 向某家报社订阅报纸,只要他们有新报纸出版,就会给你送来。只要你是他们的订户,你就会一直收到新报纸。 当你不

    2024年01月24日
    浏览(41)
  • 重温设计模式 --- 观察者模式

    观察者模式 是一种行为型设计模式,它允许对象之间建立一种一对多的关系,使得当一个对象状态改变时,所有依赖它的对象都能够自动得到通知并更新自己的状态。该模式可以帮助我们实现松耦合的系统,以便更好地应对变化和扩展。 在观察者模式中,有两个角色: 观察

    2024年02月13日
    浏览(44)
  • 设计模式(11)观察者模式

    一、概述: 1、定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 2、结构图: 实现  调用

    2024年02月11日
    浏览(36)
  • 观察者设计模式

    行为型模式(Behavioral Patterns):这类模式主要关注对象之间的通信。它们 分别是: 职责链模式(Chain of Responsibility) 命令模式(Command) 解释器模式(Interpreter) 迭代器模式(Iterator) 中介者模式(Mediator) 备忘录模式(Memento) 观察者模式(Observer) 状态模式(State) 策略

    2024年01月24日
    浏览(35)
  • 设计模式-观察者

    观察者模式是一种广泛应用于软件开发中的行为设计模式,尤其是在面向对象编程(OOP)中。该模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新 在观察者模式中,存在两个主要角色: 主题(Subject) 或 被

    2024年01月22日
    浏览(33)
  • 设计模式:行为型模式 - 观察者模式

    定义: 又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。 在观察者模式中有如下角色: Subject:抽象主题(抽象被观察

    2023年04月22日
    浏览(84)
  • js设计模式:观察者模式

    和发布订阅模式基本类似。 当某一对象状态发生变化时,所有的观察者都会收到通知。 vue响应式原理就是很经典的案例,数据发生变化,通知各个依赖。

    2024年02月19日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包