1. 程式人生 > 其它 >C++設計模式 - 觀察者模式(Observer)

C++設計模式 - 觀察者模式(Observer)

元件協作模式:

  • 現代軟體專業分工之後的第一個結果是“框架與應用程式的劃分”,“元件協作”模式通過晚期繫結,來實現框架與應用程式之間的鬆耦合,是二者之間協作時常用的模式。

典型模式

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;
}