觀察者模式:在對象之間定義一個一對多的依賴,這樣在一個對象狀態(tài)發(fā)生改變時其他對象都會收到通知,并自動更新。
原則:為交互對象之間的松耦合度設(shè)計而努力。
類圖:
屏幕快照 2015-09-21 22.58.25.png
- 主題維護者一個觀察者列表,任何一個繼承了 Observer 的類都可以將自己注冊成為觀察者,當(dāng)主題的狀態(tài)改變時,會用方法調(diào)用的方式(調(diào)用 update 方法)來通知觀察者,各個觀察者再實現(xiàn)自己的 update 方法。
- 每一個觀察者在初始化時都會傳入一個主題,并且將自己注冊在這個主題上,運行時也可以動態(tài)的從主題中移除或者注冊自己。
- 主題 has-a 多個觀察者,觀察者 has-a 主題,它們之間通過這種“組合”來交互,從而降低了耦合度。而注冊、移除、發(fā)送通知都遵循同樣的接口,從而實現(xiàn)了面向接口編程。
CPP 代碼
主題:
class SubjectInterface {
public:
virtual void registerObserver(Observer *observer) = 0;
virtual void removeObserver(Observer *observer) = 0;
virtual void notifyObservers() = 0;
};
class Subject : public SubjectInterface{
public:
Subject();
void registerObserver(Observer *observer) override;
void removeObserver(Observer *observer) override;
void notifyObservers() override;
private:
std::vector<Observer *> observers;
};
觀察者:
class Subject;
class Observer{
public:
virtual void update() = 0;
Subject *subject;
};
class ConcreteObserver1 : public Observer{
public:
ConcreteObserver1(Subject *sub);
void update() override;
void setSubject(Subject *subj) {subject = subj;};
};
class ConcreteObserver2 : public Observer{
public:
ConcreteObserver2(Subject *sub);
void update() override;
void setSubject(Subject *subj) {subject = subj;};
};