如何用C++11实现观察者模式

简介: 观察者模式是一种设计模式,定义了对象之间的一对多关系。当一个对象状态发生改变时,它的依赖者都会收到通知并自动更新。在C++11中,可以通过以下方式实现观察者模式:

观察者模式是一种设计模式,定义了对象之间的一对多关系。当一个对象状态发生改变时,它的依赖者都会收到通知并自动更新。在C++11中,可以通过以下方式实现观察者模式:


首先,我们需要创建一个观察者接口,其中包含一个更新方法。这个接口可以被多个观察者类实现,从而实现多态。

#include <iostream>  
#include <functional>  
#include <vector>  
  
using namespace std;  
  
class Observer {  
public:  
    virtual void update() = 0;  
};  
  
class Subject {  
private:  
    vector<unique_ptr<Observer>> observers;  
  
public:  
    void registerObserver(unique_ptr<Observer> obs) {  
        observers.push_back(move(obs));  
    }  
  
    void removeObserver(unique_ptr<Observer> obs) {  
        observers.erase(remove(observers.begin(), observers.end(), obs), observers.end());  
    }  
  
    void notifyObservers() {  
        for (auto& obs : observers) {  
            obs->update();  
        }  
    }  
};

接下来,我们可以创建一个具体的观察者类,它实现观察者接口,并注册到主题对象中。

class ConcreteObserver : public Observer {  
public:  
    ConcreteObserver(Subject& subject) : subject_(subject) {  
        subject.registerObserver(make_unique<ConcreteObserver>(*this));  
    }  
  
    void update() override {  
        // do something based on the subject's state  
        cout << "Subject state has changed!" << endl;  
    }  
  
private:  
    Subject& subject_;  
};


现在,我们可以创建一个主题对象,并注册多个观察者对象。当主题对象的状态发生改变时,它会通知所有的观察者对象。

int main() {  
    Subject subject;  
    ConcreteObserver observer1(subject);  
    ConcreteObserver observer2(subject);  
    // ... more observers ...  
    subject.notifyObservers(); // initial notification or state change  
    return 0;  
}


在上面的例子中,我们使用了C++11的一些特性,如auto关键字推断类型、unique_ptr智能指针和范围for循环。这样可以使代码更加简洁、安全和易于维护。

相关文章
|
7月前
|
设计模式 前端开发 JavaScript
观察者模式 vs 发布-订阅模式:两种设计模式的对决!
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
|
设计模式 前端开发
前端通用编程基础的设计模式之观察者
观察者模式是前端开发中非常常见且实用的一种设计模式。该模式可以帮助我们更好地设计和实现一些复杂的应用程序,例如事件处理、数据绑定以及状态管理等。
118 0
|
设计模式 监控
23种设计模式-关系模式-观察者模式(十五)
23种设计模式-关系模式-观察者模式(十五)
23种设计模式-关系模式-观察者模式(十五)
|
设计模式
【设计模式专题】观察者模式实战详细分析
【设计模式专题】观察者模式实战详细分析
【设计模式专题】观察者模式实战详细分析
|
消息中间件 设计模式 网络协议
Java设计模式 | 观察者模式解析与实战
Java设计模式 | 观察者模式解析与实战
|
设计模式 C#
设计模式(十五)之观察者模式
观察者模式(Observer Pattern)是设计模式中行为模式的一种,它解决了上述具有一对多依赖关系的对象的重用问题。此模式的参与者分为两大类,一类是被观察的目标,另一类是观察该目标的观察者们。 正因为该模式是基于“一对多”的关系,所以该模式一般是应用于由一个目标对象和N个观察者对象组成(当然也可以扩展为有多个目标对象,但我们现在只讨论前者)的场合。 当目标对象的状态发生改变或做出某种行为时,正在观察该目标对象的观察者们将自动地、连锁地作出相应的响应行为。
123 0
设计模式(十五)之观察者模式
|
设计模式 Java 程序员
十四、观察者模式与访问者模式详解
观 察 者 模 式 ( Observer Pattern ) , 又叫发布-订阅( Publish/Subscribe ) 模式、模型-视图 ( Model/View ) 模式、源-监听器(Source/Listener) 模式或从属者( Dependents ) 模式。定义一种一对多的依赖关系,一个主题对象可被多个观察者对象同时监听,使得每当主题对象状态变化时,所 有依赖于它的对象都会得到通知并被自动更新。属于行为型模式。
719 1
|
设计模式 Java
【设计模式】观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
【设计模式】观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
316 0
【设计模式】观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
|
设计模式
【设计模式】状态模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
【设计模式】状态模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
266 0
【设计模式】状态模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
|
设计模式 Java uml
Java设计模式之四:观察者模式
观察者模式使我们在日常项目实践中比较常用的设计模式,它体现了代码模块的高内聚低耦合的特性,我们可以方便的使用它进行代码扩展。
Java设计模式之四:观察者模式