观察者模式学习

目录

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

相关推荐
IT=>小脑虎1 小时前
2026版 Python零基础小白学习知识点【基础版详解】
开发语言·python·学习
李泽辉_2 小时前
深度学习算法学习(五):手动实现梯度计算、反向传播、优化器Adam
深度学习·学习·算法
星火开发设计2 小时前
C++ set 全面解析与实战指南
开发语言·c++·学习·青少年编程·编程·set·知识
坚持就完事了2 小时前
Linux的学习03:时间没有更新怎么解决
学习
李泽辉_2 小时前
深度学习算法学习(一):梯度下降法和最简单的深度学习核心原理代码
深度学习·学习·算法
im_AMBER2 小时前
Leetcode 99 删除排序链表中的重复元素 | 合并两个链表
数据结构·笔记·学习·算法·leetcode·链表
YangYang9YangYan3 小时前
中专大数据技术专业学习数据分析的价值分析
大数据·学习·数据分析
testpassportcn3 小时前
Fortinet FCSS_SDW_AR-7.4 認證介紹|Fortinet Secure SD-WAN 高級路由專家考試
网络·学习·改行学it
光影少年3 小时前
vite为什么速度快?
前端·学习
zhutoutoutousan3 小时前
氛围数学学习:用游戏化思维征服抽象数学
学习·算法·游戏