C++設計模式 - 觀察者模式(Observer)
阿新 • • 發佈:2022-03-19
元件協作模式:
- 現代軟體專業分工之後的第一個結果是“框架與應用程式的劃分”,“元件協作”模式通過晚期繫結,來實現框架與應用程式之間的鬆耦合,是二者之間協作時常用的模式。
典型模式
- Template Method
- Strategy
- Observer / Event
Observer
動機(Motivation)
- 在軟體構建過程中,我們需要為某些物件建立一種“通知依賴關係” ——一個物件(目標物件)的狀態發生改變,所有的依賴物件(觀察者物件)都將得到通知。如果這樣的依賴關係過於緊密,將使軟體不能很好地抵禦變化。
- 使用面向物件技術,可以將這種依賴關係弱化,並形成一種穩定的依賴關係。從而實現軟體體系結構的鬆耦合。
模式定義
定義物件間的一種一對多(變化)的依賴關係,以便當一個物件(Subject)的狀態發生改變時,所有依賴於它的物件都得到通知並自動更新。
結構
要點總結
- 使用面向物件的抽象,Observer模式使得我們可以獨立地改變目標與觀察者,從而使二者之間的依賴關係達致鬆耦合。
- 目標傳送通知時,無需指定觀察者,通知(可以攜帶通知資訊作為引數)會自動傳播。
- 觀察者自己決定是否需要訂閱通知,目標物件對此一無所知。
- Observer模式是基於事件的UI框架中非常常用的設計模式,也是MVC模式的一個重要組成部分
cpp
#include<vector> #include<iostream> //觀察者介面 class ObserverInterface { public: virtual void dosomething() = 0; virtual ~ObserverInterface() {} }; //被觀察者介面 class SubjectInterface { public: virtual void add(ObserverInterface*) = 0; virtual void remove(ObserverInterface*) = 0; virtual void notify() = 0; virtual ~SubjectInterface() {} }; class Me :public SubjectInterface { public: void add(ObserverInterface* obr)override { observer.push_back(obr); } void remove(ObserverInterface* obr)override { auto pos = std::find(observer.begin(), observer.end(), obr); if (pos != observer.end()) { observer.erase(pos); } } void notify()override { for (const auto& obs : observer) { obs->dosomething(); } } private: std::vector<ObserverInterface*>observer; }; class Wife :public ObserverInterface { public: void dosomething() override { std::cout << "收到通知,開始做飯" << std::endl; } }; class Daughter :public ObserverInterface { public: void dosomething() override { std::cout << "爸爸快回來了,去開門!" << std::endl; } }; int main() { Me me; ObserverInterface* wife = new Wife; ObserverInterface* daughter = new Daughter; //訂閱訊息 me.add(wife); me.add(daughter); //發通知 me.notify(); delete wife; delete daughter; }