什么是观察者模式?
观察者模式是一种一对多的以来关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并被自动更新。它的主体是通知的发布者,发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知,将观察者和被观察的对象分离开。
废话不多说,上代码:
#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
实例附加到该主题上。然后,当主题的状态改变时,所有附加的观察者都会收到通知并执行相应的操作。