設計模式:可複用物件導向軟體及基礎:4-7 物件行為模式:備忘錄模式(Memento)
觀察者模式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 ;
}
相關文章
- 設計模式--備忘錄模式Memento(行為型)設計模式
- 設計模式 - 備忘錄模式 ( Memento )設計模式
- java設計模式-備忘錄模式(Memento)Java設計模式
- 物件導向-設計模式-行為型物件設計模式
- C#設計模式系列:備忘錄模式(Memento)C#設計模式
- JAVA設計模式之 備忘錄模式【Memento Pattern】Java設計模式
- Java備忘錄模式(Memento模式)Java模式
- 《設計模式——可複用物件導向軟體的基礎》學習筆記(1.1)What is a design pattern?...設計模式物件筆記
- 備忘錄模式(Memento)模式
- Rust語言之GoF設計模式:備忘錄Memento模式RustGo設計模式
- 設計模式的征途—20.備忘錄(Memento)模式設計模式
- 《設計模式——可複用物件導向軟體的基礎》學習筆記(1.5)Organizing the catalog...設計模式物件筆記
- 設計模式 | 備忘錄模式及典型應用設計模式
- 《設計模式——可複用物件導向軟體的基礎》學習筆記(1.4)The catalog of design patterns...設計模式物件筆記
- 《設計模式——可複用物件導向軟體的基礎》學習筆記(1.2)Design patterns in Smalltalk MVC...設計模式物件筆記MVC
- Net設計模式例項之備忘錄模式(Memento Pattern)(2)設計模式
- JS物件導向設計模式JS物件設計模式
- 行為型設計模式 - 備忘錄模式詳解設計模式
- 《設計模式——可複用物件導向軟體的基礎》學習筆記(1.3)Describing design patterns...設計模式物件筆記
- js-物件導向-設計模式-命令模式JS物件設計模式
- 設計模式----備忘錄模式設計模式
- 設計模式 - 備忘錄模式設計模式
- 行為型模式:備忘錄模式模式
- 無廢話設計模式(16)行為型模式--備忘錄模式設計模式
- 物件導向-設計模式-建立型物件設計模式
- 設計模式(十九):備忘錄模式設計模式
- 設計模式之備忘錄模式設計模式
- 物件導向設計的設計模式(三):行為型模式(附 Demo & UML類圖)物件設計模式
- 軟體設計模式學習(二十二)備忘錄模式設計模式
- [.net 物件導向程式設計深入](26)實戰設計模式——策略模式 Strategy (行為型)物件程式設計設計模式
- 物件導向-設計模式-結構型物件設計模式
- 物件導向設計原則和模式物件模式
- 1.設計模式與物件導向設計模式物件
- 簡說設計模式——備忘錄模式設計模式
- 極簡設計模式-備忘錄模式設計模式
- GoLang設計模式11 - 備忘錄模式Golang設計模式
- Python設計模式-備忘錄模式Python設計模式
- 大話設計模式—備忘錄模式設計模式