13、观察者模式(Observer)

观察者模式(Observer)是一种行为型设计模式,用于定义对象之间的一对多依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会收到通知并自动更新。

特点

1、松耦合:观察者与被观察者之间的耦合度低,观察者可以独立于被观察者存在。
2、动态添加和删除:可以在运行时动态地添加或删除观察者。
3、广播机制:被观察者在状态变化时会通知所有注册的观察者。

适合场景

1、当一个对象的变化需要通知其他多个对象时。
2、当多个对象需要对同一事件做出反应时。
3、当希望实现可扩展的事件处理系统时。

示例

假设我们有一个天气监测系统,其中天气数据的变化会通知多个显示设备。

//g++ -o test main.cpp 
#include <algorithm>
#include <iostream>
#include <vector>
#include <string>

// 抽象观察者
class Observer {
public:
    virtual void update(float temperature, float humidity) = 0;
    virtual ~Observer() = default;
};

// 被观察者
class Subject {
public:
    virtual void registerObserver(Observer* observer) = 0;
    virtual void removeObserver(Observer* observer) = 0;
    virtual void notifyObservers() = 0;
    virtual ~Subject() = default;
};

// 具体被观察者
class WeatherData : public Subject {
public:
    void registerObserver(Observer* observer) override {
        observers.push_back(observer);
    }

    void removeObserver(Observer* observer) override {
        observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
    }

    void notifyObservers() override {
        for (Observer* observer : observers) {
            observer->update(temperature, humidity);
        }
    }

    void setMeasurements(float temp, float hum) {
        temperature = temp;
        humidity = hum;
        notifyObservers(); // 数据变化时通知所有观察者
    }

private:
    std::vector<Observer*> observers;
    float temperature;
    float humidity;
};

// 具体观察者
class CurrentConditionsDisplay : public Observer {
public:
    CurrentConditionsDisplay(Subject* weatherData) {
        this->weatherData = weatherData;
        weatherData->registerObserver(this);
    }

    void update(float temperature, float humidity) override {
        this->temperature = temperature;
        this->humidity = humidity;
        display();
    }

    void display() {
        std::cout << "Current conditions: " << temperature << "°C and " << humidity << "% humidity." << std::endl;
    }

private:
    float temperature;
    float humidity;
    Subject* weatherData;
};

// 客户端代码
int main() {
    WeatherData weatherData;

    CurrentConditionsDisplay currentDisplay(&weatherData);

    weatherData.setMeasurements(30.4f, 65.0f); // 触发通知
    weatherData.setMeasurements(29.2f, 70.0f); // 触发通知

    return 0;
}

在这个示例中,WeatherData 是被观察者,它维护一个观察者列表,并在状态变化时通知所有注册的观察者。CurrentConditionsDisplay 是具体观察者,它在收到更新时显示当前的天气状况。通过观察者模式,当天气数据变化时,所有注册的观察者都会被通知并自动更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值