linux开发

观察者模式

观察者模式的封面
#include <iostream>
#include <vector>
#include <algorithm>
#include <memory>

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

// 抽象主题接口
class Subject {
public:
    virtual ~Subject() = default;
    virtual void addObserver(std::shared_ptr<Observer> observer) = 0;
    virtual void removeObserver(std::shared_ptr<Observer> observer) = 0;
    virtual void notifyObservers() = 0;
};

// 具体主题实现
class WeatherData : public Subject {
private:
    std::vector<std::shared_ptr<Observer>> observers;
    float temperature;
    float humidity;
    float pressure;

public:
    void addObserver(std::shared_ptr<Observer> observer) override {
        observers.push_back(observer);
    }

    void removeObserver(std::shared_ptr<Observer> observer) override {
        auto it = std::find(observers.begin(), observers.end(), observer);
        if (it != observers.end()) {
            observers.erase(it);
        }
    }

    void notifyObservers() override {
        for (auto& observer : observers) {
            observer->update(temperature, humidity, pressure);
        }
    }

    void setMeasurements(float temp, float humidity, float pressure) {
        this->temperature = temp;
        this->humidity = humidity;
        this->pressure = pressure;
        measurementsChanged();
    }

private:
    void measurementsChanged() {
        notifyObservers();
    }

public:
    float getTemperature() const { return temperature; }
    float getHumidity() const { return humidity; }
    float getPressure() const { return pressure; }
};

// 具体观察者实现 - 当前条件显示
class CurrentConditionsDisplay : public Observer {
private:
    float temperature;
    float humidity;
    std::shared_ptr<Subject> weatherData;

public:
    CurrentConditionsDisplay(std::shared_ptr<Subject> weatherData) 
        : weatherData(weatherData) {
        weatherData->addObserver(shared_from_this());
    }

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

    void display() const {
        std::cout << "Current conditions: " << temperature 
                  << "F degrees and " << humidity << "% humidity" << std::endl;
    }
};

// 具体观察者实现 - 统计数据显示
class StatisticsDisplay : public Observer, public std::enable_shared_from_this<StatisticsDisplay> {
private:
    float maxTemp = 0.0f;
    float minTemp = 200.0f;
    float tempSum = 0.0f;
    int numReadings = 0;
    std::shared_ptr<Subject> weatherData;

public:
    StatisticsDisplay(std::shared_ptr<Subject> weatherData) 
        : weatherData(weatherData) {
        weatherData->addObserver(shared_from_this());
    }

    void update(float temperature, float humidity, float pressure) override {
        tempSum += temperature;
        numReadings++;

        if (temperature > maxTemp) {
            maxTemp = temperature;
        }

        if (temperature < minTemp) {
            minTemp = temperature;
        }

        display();
    }

    void display() const {
        std::cout << "Avg/Max/Min temperature = " << (tempSum / numReadings)
                  << "/" << maxTemp << "/" << minTemp << std::endl;
    }
};

// 使用示例
int main() {
    // 创建主题
    auto weatherData = std::make_shared<WeatherData>();
    
    // 创建观察者
    auto currentDisplay = std::make_shared<CurrentConditionsDisplay>(weatherData);
    auto statisticsDisplay = std::make_shared<StatisticsDisplay>(weatherData);
    
    // 模拟数据变化
    std::cout << "First weather update:" << std::endl;
    weatherData->setMeasurements(80, 65, 30.4f);
    
    std::cout << "\nSecond weather update:" << std::endl;
    weatherData->setMeasurements(82, 70, 29.2f);
    
    std::cout << "\nThird weather update:" << std::endl;
    weatherData->setMeasurements(78, 90, 29.2f);
    
    return 0;
}

重点:一对多