观察者模式学习

目录

1.介绍

2.角色

3.代码例子

4.uml类图


1.介绍

观察者模式 是一种行为型模式 ,用于在对象之间定义一种一对多的依赖关系

使得当一个对象的状态发生改变时,所有依赖它的对象都会自动收到通知并更新

简单说:一个对象变化时,自动通知一群"订阅它"的对象。

2.角色

角色 职责
Subject(主题/被观察者) 持有观察者列表,提供注册、注销和通知的接口
Observer(观察者接口) 定义接收到通知时的回调接口
ConcreteSubject(具体主题) 实现主题逻辑(比如状态变化)
ConcreteObserver(具体观察者) 实现更新逻辑,响应通知

3.代码例子

我们实现一个简单的场景:

当"天气"(WeatherStation)更新时,所有"显示屏"(Display)会自动刷新显示。

cpp 复制代码
#include <iostream>
#include <vector>
#include <string>
#include <memory>

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

// 被观察者(主题)接口
class Subject {
public:
    virtual void attach(std::shared_ptr<Observer> obs) = 0;
    virtual void detach(std::shared_ptr<Observer> obs) = 0;
    virtual void notify() = 0;
    virtual ~Subject() = default;
};

// 具体主题:天气站
class WeatherStation : public Subject {
private:
    float temperature = 0.0f;
    float humidity = 0.0f;
    std::vector<std::shared_ptr<Observer>> observers;

public:
    void setMeasurements(float t, float h) {
        temperature = t;
        humidity = h;
        notify();  // 状态变化时通知观察者
    }

    void attach(std::shared_ptr<Observer> obs) override {
        observers.push_back(obs);
    }

    void detach(std::shared_ptr<Observer> obs) override {
        observers.erase(std::remove(observers.begin(), observers.end(), obs), observers.end());
    }

    void notify() override {
        for (auto& obs : observers) {
            obs->update(temperature, humidity);
        }
    }
};

// 具体观察者:显示屏
class Display : public Observer {
private:
    std::string name;
public:
    Display(const std::string& n) : name(n) {}
    void update(float temperature, float humidity) override {
        std::cout << "[" << name << "] "
                  << "Temperature: " << temperature 
                  << "°C, Humidity: " << humidity << "%" << std::endl;
    }
};

// 测试
int main() {
    auto station = std::make_shared<WeatherStation>();

    auto display1 = std::make_shared<Display>("Main Display");
    auto display2 = std::make_shared<Display>("Outdoor Display");

    station->attach(display1);
    station->attach(display2);

    station->setMeasurements(25.5f, 60.0f);
    std::cout << "------ Weather Updated ------" << std::endl;
    station->setMeasurements(30.2f, 55.0f);

    return 0;
}

4.uml类图

相关推荐
m4Rk_1 小时前
【论文阅读】Agent 记忆机制(47):Nemori——用“预测误差”判断什么经验值得被记住
论文阅读·人工智能·学习·开源·github
约克31 小时前
2024年空调除甲醛技术参数与性能评测解析
学习
kkkkkkkkkk_Z1 小时前
学嵌入式和C语言编程数据结构|学习日记Day21:内核链表与队列学习
c语言·数据结构·学习
kdxiaojie3 小时前
Linux USB驱动阅读笔记(1)
linux·笔记·学习·usb
呼噜想睡觉3 小时前
Bootstrap3完成从导航到页脚完整页面开发
学习
深蓝海拓6 小时前
基于QtPy (PySide6) 的PLC-HMI工程项目(十五)后续完善和改进:PLC端数据解析的防粘包、残包、废包、拆包
笔记·学习·plc
小黄蚁7 小时前
LVGL学习笔记(六)
笔记·学习
zyf1044167 小时前
暑期实践日志 Day33:整体复盘核查视频,完善剪辑成果
学习·计算机网络·剪辑·暑期实践·课题任务
01_ice7 小时前
前端学习css
前端·css·学习
for_ever_love__8 小时前
PySpark学习: 数据输出
开发语言·python·学习·spark