【C++设计模式】行为型模式:观察者模式

文章目录

行为型模式:观察者模式

观察者模式定义了一种一对多的依赖关系:它让一个主题(被观察者)对象关联多个观察者对象,并且当主题对象的状态发生变化时,它会主动通知这些观察者对象,使它们能够自动更新自己或执行相应的响应操作。

以一个设备的温度显示系统为例,在这个示例中,温度检测仪是被观察者,当设备温度发生变化时,它会通知所有的显示器更新温度信息。

cpp 复制代码
#include <iostream>
#include <vector>
#include <string>
#include <algorithm> 

// 观察者接口
class IObserver {
public:
    virtual void update(float temperature) = 0;
    virtual ~IObserver() {}
};

// 主题接口(Subject)
class ISubject {
public:
    virtual void registerObserver(IObserver* observer) = 0;
    virtual void removeObserver(IObserver* observer) = 0;
    virtual void notifyObservers() = 0;
    virtual ~ISubject() {}
};

// 被观察者类:设备温度检测仪
class DeviceTemperatureMonitor : public ISubject {
private:
    std::vector<IObserver*> observers;
    float temperature;

public:
    // 注册观察者
    void registerObserver(IObserver* observer) override {
        observers.push_back(observer);
    }

    // 移除观察者
    void removeObserver(IObserver* observer) override {
    // std::remove将所有与指定值observer相等的元素移动到容器的末尾,并返回指向第一个不需要保留的元素的迭代器
        observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
    }

    // 通知所有观察者
    void notifyObservers() override {
        for (IObserver* observer : observers) {
            observer->update(temperature);
        }
    }

    // 设置温度状态并通知所有观察者
    void setTemperature(float temp) {
        temperature = temp;
        notifyObservers();
    }
};

// 观察者类:手机显示器
class PhoneDisplay : public IObserver {
private:
    std::string deviceName;

public:
    PhoneDisplay(const std::string& name) : deviceName(name) {}

    void update(float temperature) override {
        std::cout << "Phone Display (" << deviceName << ") - Device Temperature: " 
                  << temperature << "°C\n";
    }
};

// 观察者类:窗口显示器
class WindowDisplay : public IObserver {
private:
    std::string location;

public:
    WindowDisplay(const std::string& loc) : location(loc) {}

    void update(float temperature) override {
        std::cout << "Window Display at " << location << " - Device Temperature: " 
                  << temperature << "°C\n";
    }
};

int main() {
    // 创建被观察者对象(设备温度检测仪)
    DeviceTemperatureMonitor tempMonitor;

    // 创建观察者对象(显示设备)
    PhoneDisplay phoneDisplay1("iPhone");
    PhoneDisplay phoneDisplay2("Samsung");
    WindowDisplay windowDisplay("Office");

    // 注册观察者
    tempMonitor.registerObserver(&phoneDisplay1);
    tempMonitor.registerObserver(&phoneDisplay2);
    tempMonitor.registerObserver(&windowDisplay);

    // 模拟温度数据更新
    std::cout << "Temperature Update 1:\n";
    tempMonitor.setTemperature(75.0f);

    std::cout << "\nTemperature Update 2:\n";
    tempMonitor.setTemperature(80.0f);

    // 移除一个观察者
    tempMonitor.removeObserver(&phoneDisplay2);

    std::cout << "\nTemperature Update 3 (After removing Samsung Phone Display):\n";
    tempMonitor.setTemperature(85.0f);

    return 0;
}
复制代码
Temperature Update 1:
Phone Display (iPhone) - Device Temperature: 75°C
Phone Display (Samsung) - Device Temperature: 75°C
Window Display at Office - Device Temperature: 75°C

Temperature Update 2:
Phone Display (iPhone) - Device Temperature: 80°C
Phone Display (Samsung) - Device Temperature: 80°C
Window Display at Office - Device Temperature: 80°C

Temperature Update 3 (After removing Samsung Phone Display):
Phone Display (iPhone) - Device Temperature: 85°C
Window Display at Office - Device Temperature: 85°C
相关推荐
码匠许师傅5 小时前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
夜不会漫长10 小时前
C++入门(1)
开发语言·c++·算法
旖旎夜光11 小时前
LeetCode 852:山脉数组的峰顶索引(二分查找) —— 题解
数据结构·c++·算法·leetcode·二分查找
..Dauntless..12 小时前
【C++】继承——基类和派生类的配合
开发语言·c++·算法
程与留12 小时前
05_Qt 核心模块概览——Qt Core、Gui、Widgets、Quick 的职责划分
c++·qt
buhuizhiyuci12 小时前
【QT-百日筑基篇】修真世界摸爬滚打多年,终于黄天不负有心人,突破炼器中期——常用控件QWight的属性
开发语言·c++·qt·gui·图形化
冻柠檬飞冰走茶16 小时前
《数据结构实验指导-C++语言版》 求单链表list中的元素个数,即表长
开发语言·数据结构·c++·算法·list
_Narcissus_16 小时前
动态规划初探(含完整代码实现)
c语言·数据结构·c++·算法·动态规划·背包问题·最短路径
法哥201217 小时前
用 C++ 控制 CMW100,到底在干什么?
开发语言·c++
AI人工智能+电脑小能手17 小时前
大白话说Java设计模式-28-模板方法模式(业务实战篇)
java·设计模式·模板方法模式·spring源码·订单系统·代码复用