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

23种设计模式 - 观察者模式

模式定义

观察者模式(Observer Pattern)是一种行为型设计模式,定义了一对多的依赖关系:当一个对象(称为主题)状态变化时,所有依赖它的对象(称为观察者)会自动收到通知并更新。这种模式广泛用于事件驱动系统,如数控系统中的状态监控。


模式结构

抽象主题(Subject)

  • 维护观察者列表,提供添加、删除和通知观察者的接口。
    具体主题(ConcreteSubject)
  • 实现抽象主题接口,存储具体状态(如数控机床的温度、加工状态),并在状态变化时触发通知。
    抽象观察者(Observer)
  • 定义更新接口(如 Update()),供具体观察者实现。
    具体观察者(ConcreteObserver)
  • 实现更新逻辑,响应主题状态变化(如更新监控界面或记录日志)。

适用场景

状态变化触发多组件更新:如数控机床温度超限时通知冷却系统和报警器。
解耦事件源与处理逻辑:避免数控系统各模块直接耦合。
动态订阅机制:允许运行时增减监控模块(如临时添加日志记录器)。


C++示例(数控系统场景)

场景说明:
数控机床运行时,温度传感器检测到温度变化时,需通知监控界面和报警系统。

#include 
#include 
#include 

// 抽象观察者
class Observer {
public:
    virtual ~Observer() = default;
    virtual void update(float temperature) = 0;  // 温度变化时触发
};

// 抽象主题:数控机床传感器
class TemperatureSensor {
public:
    virtual ~TemperatureSensor() = default;
    virtual void attach(std::shared_ptr observer) = 0;
    virtual void notify() = 0;
};

// 具体主题:温度传感器实现
class ConcreteSensor : public TemperatureSensor {
private:
    std::vector> observers_;
    float temperature_ = 25.0f;  // 初始温度

public:
    void setTemperature(float temp) {
        temperature_ = temp;
        notify();  // 温度变化时通知观察者
    }

    void attach(std::shared_ptr observer) override {
        observers_.push_back(observer);
    }

    void notify() override {
        for (auto& observer : observers_) {
            observer->update(temperature_);
        }
    }
};

// 具体观察者1:监控界面
class MonitorUI : public Observer {
public:
    void update(float temperature) override {
        std::cout << "监控界面更新:当前温度 " << temperature << "°C\n";
    }
};

// 具体观察者2:高温报警器
class AlarmSystem : public Observer {
public:
    void update(float temperature) override {
        if (temperature > 80.0f) {
            std::cout << "警告:温度超过安全阈值!\n";
        }
    }
};

// 客户端
int main() {
    auto sensor = std::make_shared();
    auto monitor = std::make_shared();
    auto alarm = std::make_shared();

    // 注册观察者
    sensor->attach(monitor);
    sensor->attach(alarm);

    // 模拟温度变化
    sensor->setTemperature(45.0f);  // 监控界面更新
    sensor->setTemperature(85.0f);  // 触发报警
}

代码解释
主题与观察者解耦:ConcreteSensor 仅负责通知,不关心观察者的具体逻辑。
动态扩展性:新增观察者(如日志记录器)无需修改主题代码。
数控系统应用:温度变化时,监控界面和报警系统自动响应,符合实时监控需求。

相关文章:

  • Transformer解析——(一)概述
  • Nginx 安装及配置教程(Windows)【安装】
  • 前端一些可视化图表工具
  • cs106x-lecture12(Autumn 2017)-SPL实现
  • Android14(13)添加墨水屏手写API
  • 一款开源可独立部署的知识管理工具!!
  • LeetCode 热题 100_搜索插入位置(63_35_简单_C++)(二分查找)(”>>“ 与 “/”)
  • 离线部署大模型:ollama+deepseek+open-webui
  • Node.js高频面试题精选及参考答案
  • 深入了解 Pinia:Vue 的下一代状态管理工具 (上篇)
  • Android 进程间通信中 Messager 的简单使用
  • 大模型领域常见的专业术语和关键词及简要解释
  • 量子算法导论
  • 【python】网页批量转PDF
  • 【Python爬虫(30)】构建高效爬虫数据管理体系:从抓取到协作
  • 【Linux】序列化、守护进程、应用层协议HTTP、Cookie和Session
  • 头条搜索下拉词和抖音搜索提示词删除的方法
  • 通过 WSL 2(Windows Subsystem for Linux 2)运行基于 Linux 的容器,怎么在浏览器中打开镜像默认页
  • 如何调用 DeepSeek API:详细教程与示例
  • 环境变量3
  • 怎么黑进网站后台/友情链接格式
  • 更新网站的方法/磁力搜索器 磁力猫
  • 金融网站怎么做的/登录百度账号注册
  • 卓老师建站网站后台如何直接登陆/关键词seo排名怎么做的
  • 郑州哪有做网站的汉狮/百度竞价开户
  • 世界球队最新排名/优化大师官方正版下载