一、应用场景
当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
二、代码样例
class Subject; //类的前向声明
class Observer { //观察者父类
protected:
Subject *subject;
public:
virtual void update() = 0;
virtual ~Observer() = default;
};
class Subject { // 被观察对象
public:
int state = 0;
vector<Observer *> observerList;
public:
void notificationAllObject() {
for (auto &observer : observerList) {
observer->update();
}
}
void setState(int state) {
this->state = state;
notificationAllObject();
}
void attach(Observer *observer) {
this->observerList.emplace_back(observer);
}
};
class ObserverOne : Observer { // 观察者实现
public:
ObserverOne(Subject *subject) {
this->subject = subject;
this->subject->attach(this);
}
void update() override {
cout << "ObserverOne, state = " << this->subject->state << endl;
}
};
int main() {
Subject *subject = new Subject;
new ObserverOne(subject);
subject->setState(1);
subject->setState(2);
delete subject;
}
三、缺点
- 观察者过多,通知会花费较长时间
- 观察者与被观察者之间循环依赖,导致程序崩溃