觀察者模式(Observer Pattern)是一種設(shè)計模式,它定義了對象之間的一對多依賴關(guān)系,當(dāng)一個對象(被觀察對象,也稱為主題subject)的狀態(tài)發(fā)生變化時,所有依賴于它的對象(觀察者observer)都會得到通知并自動更新
以下是使用C++實現(xiàn)觀察者模式的示例代碼:
#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() {
// 創(chuàng)建具體主題和觀察者對象
ConcreteSubject subject;
ConcreteObserver observer1, observer2;
// 注冊觀察者
subject.registerObserver(&observer1);
subject.registerObserver(&observer2);
// 改變主題狀態(tài),觸發(fā)通知
subject.changeState();
return 0;
}
在這個示例中,我們首先定義了Observer
接口和ConcreteObserver
具體實現(xiàn)類。然后,我們定義了Subject
接口和ConcreteSubject
具體實現(xiàn)類。ConcreteSubject
類維護了一個觀察者列表,并提供了注冊、移除觀察者和通知觀察者的方法。
在main()
函數(shù)中,我們創(chuàng)建了一個ConcreteSubject
對象和兩個ConcreteObserver
對象。然后,我們將這兩個觀察者注冊到主題中。當(dāng)我們調(diào)用changeState()
方法改變主題狀態(tài)時,它會自動通知所有已注冊的觀察者。運行此程序,你將看到每次主題狀態(tài)發(fā)生變化時,觀察者都會收到通知。