观察者模式(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 是具体观察者,它在收到更新时显示当前的天气状况。通过观察者模式,当天气数据变化时,所有注册的观察者都会被通知并自动更新。