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

本文介绍了如何在C++11中实现观察者模式,通过创建观察者接口和主题类,当主题状态改变时,所有依赖的观察者都会收到通知并自动更新。示例中使用了unique_ptr和范围for循环等C++11特性,确保代码的简洁性和安全性。
摘要由CSDN通过智能技术生成

观察者模式是一种设计模式,定义了对象之间的一对多关系。当一个对象状态发生改变时,它的依赖者都会收到通知并自动更新。在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循环。这样可以使代码更加简洁、安全和易于维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值