观察者模式学习

目录

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类图

相关推荐
通信小呆呆1 天前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
H__Rick1 天前
自动对焦学习-3
人工智能·学习·计算机视觉
Daisy Lee1 天前
量化学习-第1章-什么是量化金融
学习·金融·datawhale
Alsn861 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
YM52e1 天前
买菜计算器小应用 - HarmonyOS ArkUI 开发实战-PC版本
学习·华为·harmonyos·鸿蒙·鸿蒙系统
小雨下雨的雨1 天前
HarmonyOS ArkUI训练营入门-组件掌握系列-Animation 动画效果实现-PC版本
学习·华为·harmonyos·鸿蒙
cqbzcsq1 天前
CellFlow虚拟细胞论文阅读
论文阅读·人工智能·笔记·学习·生物信息
YangYang9YangYan1 天前
2026初入职场学习数据分析的价值
学习·数据挖掘·数据分析
guslegend1 天前
理论学习:什么是 Coding Agent?
学习
自传.1 天前
尚硅谷 Vibe Coding|第三章(1) Claude Code深度使用与进阶技巧 学习笔记
笔记·学习·尚硅谷·vibecoding