观察者模式(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()
方法改变主题状态时,它会自动通知所有已注册的观察者。运行此程序,你将看到每次主题状态发生变化时,观察者都会收到通知。