设计模式:观察者模式

观察者模式是一种设计模式,也被称为 "发布-订阅"模式。这种模式在需要维持一致状态的对象之间建立一个依赖关系时非常有用。

想象一下这样的场景:你正在追一部电视剧,每当有新的一集播出时,你都希望能得到通知。在这个情况下,电视剧就是"主题"或"发布者",而你就是一个"观察者"或"订阅者"。当新一集播出(发布者状态变化)时,你会得到通知,这就是观察者模式在现实生活中的应用。

在编程中,我们也可以使用观察者模式。考虑有一个"主题"对象,和许多跟随这个主题的"观察者"对象。每当主题的状态发生变化时,所有的观察者都会得到通知,并且可以据此进行适当的反应。主题对象维护了观察者列表,并提供了添加和删除观察者的方法。

在QT的信号和槽机制中,就使用了观察者模式。对象(或部件)可以发出信号(当特定事件发生时),其他对象可以监听(或订阅)这个信号,然后定义槽函数(或回调函数)来响应这个信号,从而实现彼此的解耦合。

举个例子:

观察者模式就像一个新闻订阅服务。假设你订阅了一个新闻网站,每当新闻网站发布新的新闻时,你会收到通知或更新。在这个例子中,新闻网站是"发布者"或"主题",而你是"订阅者"或"观察者"。

具体来讲,观察者模式中包含一个被观察对象(也被称为主题)与多个观察者。被观察对象会在状态改变时通知所有的观察者。

以下是一个简单的C++代码例子来演示观察者模式的实现:

cpp 复制代码
#include <iostream>
#include <list>
#include <string>

class Observer {
public:
    virtual void update(const std::string& message) = 0; // 更新消息
};

class NewsPublisher {
private:
    std::list<Observer*> observers; // 观察者列表
    std::string message; // 消息

public:
    void addObserver(Observer* observer) {
        observers.push_back(observer);
    }

    void removeObserver(Observer* observer) {
        observers.remove(observer);
    }

    void notifyObservers() {
        for (auto& observer : observers) {
            observer->update(message);
        }
    }

    void createNews(const std::string& news) {
        this->message = news;
        notifyObservers();
    }
};

class NewsSubscriber : public Observer {
public:
    void update(const std::string& message) override {
        std::cout << "Received news: " << message << std::endl;
    }
};

int main() {
    NewsPublisher publisher;

    NewsSubscriber subscriber1, subscriber2;

    publisher.addObserver(&subscriber1);
    publisher.addObserver(&subscriber2);

    publisher.createNews("Breaking news!");

    return 0;
}

在此例中,NewsPublisher是"主题",NewsSubscriber是"观察者"。当NewsPublisher发布新消息(createNews)时,所有的观察者都会收到更新通知。

相关推荐
_哆啦A梦17 小时前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
阿闽ooo4 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4964 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃4 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式
驴儿响叮当20104 天前
设计模式之状态模式
设计模式·状态模式
电子科技圈4 天前
XMOS推动智能音频等媒体处理技术从嵌入式系统转向全新边缘计算
人工智能·mcu·物联网·设计模式·音视频·边缘计算·iot
徐先生 @_@|||4 天前
安装依赖三方exe/msi的软件设计模式
设计模式
清水白石0085 天前
观察者模式全解析:用 Python 构建优雅的事件系统,让组件彻底解耦
java·python·观察者模式
希望_睿智5 天前
实战设计模式之访问者模式
c++·设计模式·架构
茶本无香5 天前
设计模式之十六:状态模式(State Pattern)详解 -优雅地管理对象状态,告别繁琐的条件判断
java·设计模式·状态模式