观察者模式学习

目录

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

相关推荐
学历真的很重要43 分钟前
【系统架构师】第二章 操作系统知识 - 第二部分:进程管理(详解版)
学习·职场和发展·系统架构·系统架构师
Nebula_g44 分钟前
线程进阶: 无人机自动防空平台开发教程(更新)
java·开发语言·数据结构·学习·算法·无人机
星期五不见面1 小时前
机器人学习!(二)ROS2-节点(7)2026/02/03
学习
狂奔蜗牛飙车1 小时前
Python学习之路-循环语句学习详解
python·学习·python学习·#python学习笔记·循环语句详解
电饭叔2 小时前
Jupyter学习中的问题--FileNotFoundError
ide·学习·jupyter
峥嵘life2 小时前
Android16 【CTS】CtsMediaCodecTestCases等一些列Media测试存在Failed项
android·linux·学习
EnglishJun3 小时前
数据结构的学习(四)---栈和队列
数据结构·学习
2501_901147833 小时前
学习笔记:单调递增数字求解的迭代优化与工程实践
linux·服务器·笔记·学习·算法
苦逼IT运维4 小时前
从 0 到 1 理解 Kubernetes:一次“破坏式”学习实践(一)
linux·学习·docker·容器·kubernetes
野犬寒鸦5 小时前
从零起步学习并发编程 || 第五章:悲观锁与乐观锁的思想与实现及实战应用与问题
java·服务器·数据库·学习·语言模型