温馨提示×

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

c++
小樊
82
2024-08-29 18:47:13
栏目: 编程语言

观察者模式(Observer Pattern)是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象(被观察对象,也称为主题subject)的状态发生变化时,所有依赖于它的对象(观察者observer)都会得到通知并自动更新

以下是使用C++实现观察者模式的示例代码:

#include<iostream>
#include <list>

// 观察者接口
class Observer {
public:
    virtual void update() = 0;
};

// 具体观察者
class ConcreteObserver : public Observer {
public:
    void update() override {
        std::cout << "Observer received a notification!"<< std::endl;
    }
};

// 被观察对象(主题)接口
class Subject {
public:
    virtual void registerObserver(Observer* observer) = 0;
    virtual void removeObserver(Observer* observer) = 0;
    virtual void notifyObservers() = 0;
};

// 具体主题
class ConcreteSubject : public Subject {
private:
    std::list<Observer*> observers;

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

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

    void notifyObservers() override {
        for (Observer* observer : observers) {
            observer->update();
        }
    }

    void changeState() {
        std::cout << "Subject state changed!"<< std::endl;
        notifyObservers();
    }
};

int main() {
    // 创建具体主题和观察者对象
    ConcreteSubject subject;
    ConcreteObserver observer1, observer2;

    // 注册观察者
    subject.registerObserver(&observer1);
    subject.registerObserver(&observer2);

    // 改变主题状态,触发通知
    subject.changeState();

    return 0;
}

在这个示例中,我们首先定义了Observer接口和ConcreteObserver具体实现类。然后,我们定义了Subject接口和ConcreteSubject具体实现类。ConcreteSubject类维护了一个观察者列表,并提供了注册、移除观察者和通知观察者的方法。

main()函数中,我们创建了一个ConcreteSubject对象和两个ConcreteObserver对象。然后,我们将这两个观察者注册到主题中。当我们调用changeState()方法改变主题状态时,它会自动通知所有已注册的观察者。运行此程序,你将看到每次主题状态发生变化时,观察者都会收到通知。

0