設計模式:可複用物件導向軟體及基礎:4-7 物件行為模式:備忘錄模式(Memento)

~怎麼回事啊~發表於2020-10-04

觀察者模式observer

概念

        Observer模式是行為模式之一,它的作用是當一個物件的狀態發生變化時,能夠自動通知其他關聯物件,自動重新整理物件狀態。

        Observer模式提供給關聯物件一種同步通訊的手段,使某個物件與依賴它的其他物件之間保持狀態同步。

角色和職責

 

 

Subject(被觀察者)
       被觀察的物件。當需要被觀察的狀態發生變化時,需要通知佇列中所有觀察者物件。Subject需要維持(新增,刪除,通知)一個觀察者物件的佇列列表。

ConcreteSubject
       被觀察者的具體實現。包含一些基本的屬性狀態及其他操作。

Observer(觀察者)
       介面或抽象類。當Subject的狀態發生變化時,Observer物件將通過一個callback函式得到通知。

ConcreteObserver
     觀察者的具體實現。得到通知後將完成一些具體的業務邏輯處理。

典型應用

- 偵聽事件驅動程式設計中的外部事件

- 偵聽/監視某個物件的狀態變化

- 釋出者/訂閱者(publisher/subscriber)模型中,當一個外部事件(新的產品,訊息的出現等等)被觸發時,通知郵件列表中的訂閱者

適用於:

        定義物件間一種一對多的依賴關係,使得每一個物件改變狀態,則所有依賴於他們的物件都會得到通知。

使用場景:定義了一種一對多的關係,讓多個觀察物件(公司員工)同時監聽一個主題物件(祕書),主題物件狀態發生變化時,會通知所有的觀察者,使它們能夠更新自己

#include <iostream>
using namespace std;
#include "vector"
#include "string"

class Secretary;

//玩遊戲的同事類(觀察者)
class PlayserObserver
{
public:
	PlayserObserver(string name, Secretary *secretary)
	{
		m_name = name;
		m_secretary = secretary;
	}
	void update(string action)
	{
		cout << "觀察者收到action:" << action << endl;
	}
private:
	string		m_name;
	Secretary	*m_secretary;
};

//祕書類(主題物件,通知者)
class Secretary
{
public:
	void addObserver(PlayserObserver *o)
	{
		v.push_back(o);
	}
	void Notify(string action)
	{
		for (vector<PlayserObserver *>::iterator it= v.begin(); it!=v.end(); it++ )
		{
			(*it)->update(action);
		}
	}
	void setAction(string action)
	{
		m_action = action;
		Notify(m_action);
	}
private:
	string m_action;
	vector<PlayserObserver *> v;
};

void main()
{
	//subject 被觀察者
	Secretary *s1 = new Secretary;

	//具體的觀察者 被通知物件
	PlayserObserver *po1 = new PlayserObserver("小張", s1);
	//PlayserObserver *po2 = new PlayserObserver("小李", s1);
	s1->addObserver(po1);
	//s1->addObserver(po2);
	s1->setAction("老闆來了");
	s1->setAction("老闆走了");
	cout<<"hello..."<<endl;
	system("pause");
	return ;
}

 

相關文章