C++实现设计模式之观察者模式

简介: 什么是观察者模式?观察者模式是一种一对多的以来关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并被自动更新。它的主体是通知的发布者,发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知,将观察者和被观察的对象分离开。

什么是观察者模式


观察者模式是一种一对多的以来关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并被自动更新。它的主体是通知的发布者,发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知,将观察者和被观察的对象分离开。


废话不多说,上代码:

#include <iostream>  
#include <vector>  
using namespace std;  
// 观察者接口  
class Observer {  
public:  
    virtual void update() = 0;  
};  
// 主题接口  
class Subject {  
public:  
    virtual void attach(Observer* observer) = 0;  
    virtual void detach(Observer* observer) = 0;  
    virtual void notify() = 0;  
};  
// 具体主题实现  
class ConcreteSubject : public Subject {  
private:  
    vector<Observer*> observers;  
public:  
    void attach(Observer* observer) {  
        observers.push_back(observer);  
    }  
    void detach(Observer* observer) {  
        for (int i = 0; i < observers.size(); i++) {  
            if (observers[i] == observer) {  
                observers.erase(observers.begin() + i);  
                break;  
            }  
        }  
    }  
    void notify() {  
        for (int i = 0; i < observers.size(); i++) {  
            observers[i]->update();  
        }  
    }  
    void stateChanged() {  
        notify();  
    }  
};  
// 具体观察者实现  
class ConcreteObserver : public Observer {  
private:  
    Subject* subject;  
public:  
    ConcreteObserver(Subject* subject) {  
        this->subject = subject;  
        subject->attach(this);  
    }  
    ~ConcreteObserver() {  
        subject->detach(this);  
    }  
    void update() {  
        // 观察者收到通知后执行的操作  
        cout << "Subject changed!" << endl;  
    }  
};  
int main() {  
    ConcreteSubject subject;  
    ConcreteObserver observer1(&subject);  
    ConcreteObserver observer2(&subject);  
    ConcreteObserver observer3(&subject);  
    subject.stateChanged(); // 触发通知,观察者更新  
    return 0;  
}

在上面的代码中,Observer是观察者接口,Subject是主题接口。ConcreteSubject是具体的主题实现,它维护一个观察者列表,并在状态改变时通知所有观察者。ConcreteObserver是具体的观察者实现,它在被通知时执行特定的操作。


在主函数中,我们创建了一个ConcreteSubject实例,并将三个ConcreteObserver实例附加到该主题上。然后,当主题的状态改变时,所有附加的观察者都会收到通知并执行相应的操作。

相关文章
|
2月前
|
设计模式 PHP
php设计模式--观察者模式(4.1)面向过程完成页面内容切换
php设计模式--观察者模式(4.1)面向过程完成页面内容切换
19 0
|
2月前
|
设计模式 监控 Java
设计模式 - 观察者模式(Observer):Java中的战术与策略
【4月更文挑战第7天】观察者模式是构建可维护、可扩展系统的关键,它在Java中通过`Observable`和`Observer`实现对象间一对多的依赖关系,常用于事件处理、数据绑定和同步。该模式支持事件驱动架构、数据同步和实时系统,但需注意避免循环依赖、控制通知粒度,并关注性能和内存泄漏问题。通过明确角色、使用抽象和管理观察者注册,可最大化其效果。
|
1月前
|
设计模式 消息中间件 存储
跟着GPT学设计模式之观察者模式
观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,其依赖对象都能够收到通知并自动更新。一般情况下,被依赖的对象叫作被观察者(Observable),依赖的对象叫作观察者(Observer)。
18 1
|
11天前
|
设计模式 存储 Java
Java设计模式之观察者模式详解
Java设计模式之观察者模式详解
|
11天前
|
设计模式
观察者模式-大话设计模式
观察者模式-大话设计模式
6 0
|
2月前
|
设计模式 开发框架 算法
C++中的设计模式:基本概念与应用
C++中的设计模式:基本概念与应用
30 2
|
17天前
|
设计模式 存储
行为型设计模式之观察者模式
行为型设计模式之观察者模式
|
2月前
|
设计模式 Java
Java一分钟之-设计模式:观察者模式与事件驱动
【5月更文挑战第17天】本文探讨了Java中实现组件间通信的观察者模式和事件驱动编程。观察者模式提供订阅机制,当对象状态改变时通知所有依赖对象。然而,它可能引发性能问题、循环依赖和内存泄漏。代码示例展示了如何实现和避免这些问题。事件驱动编程则响应用户输入和系统事件,但回调地狱和同步/异步混淆可能造成困扰。JavaFX事件驱动示例解释了如何处理事件。理解这两种模式有助于编写健壮的程序。
33 1
|
2月前
|
设计模式 JavaScript 前端开发
js设计模式-观察者模式与发布/订阅模式
观察者模式和发布/订阅模式是JavaScript中的两种设计模式,用于处理对象间的通信和事件处理。观察者模式中,一个主题对象状态改变会通知所有观察者。实现包括定义主题和观察者对象,以及在主题中添加、删除和通知观察者的功能。发布/订阅模式则引入事件管理器,允许发布者发布事件,订阅者通过订阅接收通知。
|
1月前
|
设计模式 前端开发 NoSQL
设计模式第八讲:观察者模式和中介者模式详解
 定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。
177 0