当前位置: 首页 > news >正文

观察者模式学习

目录

1.介绍

2.角色

3.代码例子

4.uml类图


1.介绍

观察者模式是一种行为型模式,用于在对象之间定义一种一对多的依赖关系
使得当一个对象的状态发生改变时,所有依赖它的对象都会自动收到通知并更新

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

2.角色

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

3.代码例子

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

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

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

http://www.dtcms.com/a/528483.html

相关文章:

  • 常用标准电阻表 | E24标准电阻表
  • 三、检索增强生成(RAG)技术体系
  • 【Leetcode hot 100】739.每日温度
  • JAVA国际版任务悬赏发布接单系统源码支持IOS+Android+H5
  • 网站做选择题怎么快速选择艺术品拍卖网站源码php
  • 大模型微调完整步骤( LLama-Factory)
  • Rust + PostgreSQL:deadpool 和 diesel 数据库连接池实战(四)
  • 关于门户网站建设讲话关键词挖掘查询工具爱站网
  • GitHub等平台形成的开源文化正在重塑可以让
  • RHCSA-12计划任务
  • 快速提高网站权重提升门户网站地方生活门户有哪些
  • 【开题答辩全过程】以 产品报价系统为例,包含答辩的问题和答案
  • JS基础Day01
  • 建c2c网站深圳有名的品牌设计公司
  • 网页文字游戏seo入门
  • Windows系统内置的WIN32控件可分为标准控件和通用控件两大类
  • 数据结构初阶:Java中的ArrayList
  • Linux修炼:Ext系列文件系统
  • RocketMQ源码详解(消费端启动流程)
  • 利用DeepSeek改写递归CTE SQL语句为Python程序及优化
  • Zama TFHE 密文的Bootstrapping:小于1ms!
  • Spring Boot3零基础教程,函数式 Web 新特性,笔记51
  • Nginx----反向代理
  • 后端学习笔记--登录认证
  • 【开题答辩全过程】以 餐健一体化管理系统为例,包含答辩的问题和答案
  • 大型网站建设的难点是什么企业网站建设图片
  • 智能体通信协议详解:MCP/A2A/ANP
  • 公司大厅设计效果图大全站长工具seo综合查询
  • 【MYSQL】第二篇:SQL进阶指南:增删改查与性能优化实战手册
  • Spring Boot3零基础教程,Profile 配置文件 按环境分配置文件,笔记56