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月前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
67 0
|
1月前
|
设计模式 监控 Java
设计模式 - 观察者模式(Observer):Java中的战术与策略
【4月更文挑战第7天】观察者模式是构建可维护、可扩展系统的关键,它在Java中通过`Observable`和`Observer`实现对象间一对多的依赖关系,常用于事件处理、数据绑定和同步。该模式支持事件驱动架构、数据同步和实时系统,但需注意避免循环依赖、控制通知粒度,并关注性能和内存泄漏问题。通过明确角色、使用抽象和管理观察者注册,可最大化其效果。
|
19天前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
20天前
|
设计模式 消息中间件 存储
【设计模式系列笔记】观察者模式
观察者模式是一种设计模式,它允许一个对象(主题)维护一组依赖于它的对象(观察者)并在状态发生变化时通知它们。这种模式属于行为型模式。在观察者模式中,主题是被观察的对象,而观察者是依赖于主题的对象,当主题的状态发生变化时,所有注册的观察者都会得到通知并自动更新。
23 0
|
1月前
|
设计模式 Java
23种设计模式,观察者模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。
26 2
|
2月前
|
设计模式 算法 中间件
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
127 1
|
2月前
|
消息中间件 缓存 监控
【C++ 观察者模式的应用】跨进程观察者模式实战:结合ZeroMQ和传统方法
【C++ 观察者模式的应用】跨进程观察者模式实战:结合ZeroMQ和传统方法
96 1
|
2月前
|
设计模式 机器学习/深度学习 算法
C++设计模式新篇章:掌握状态委托
C++设计模式新篇章:掌握状态委托
75 0
|
2月前
|
设计模式 算法 C++
从 C++ 优化状态机实现:结合设计模式的实用指南
从 C++ 优化状态机实现:结合设计模式的实用指南
69 1
|
2月前
|
设计模式 存储 安全
C++多线程管理的艺术:从基础到设计模式
C++多线程管理的艺术:从基础到设计模式
67 0