觀察者模式

2021-08-20 19:33:26 字數 2740 閱讀 6664

觀察者模式(observer pattern),定義了物件間的一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件(被觀察者)。當主題物件的狀態發生更改時,會通知所有觀察者,讓它們能夠自動更新。

背景
很多時候,在應用程式的一部分發生更改時,需要同時更新應用程式的其他部分。有一種方法是:讓接收者反覆檢查傳送者來進行更新,但是這種方法存在兩個主要問題:

占用大量的 cpu 時間來檢查新的狀態

依賴於檢測更新的時間間隔,可能不會立即獲得更新

對於這個問題,有乙個簡單的解決方案 - 觀察者模式。

優缺點

優點:>

觀察者和被觀察者是抽象耦合的

建立一套觸發機制

缺點:>

如果乙個被觀察者物件有很多的直接和間接的觀察者,將所有的觀察者都通知到會花費很多時間。

如果在觀察者和觀察目標之間有迴圈依賴的話,觀察目標會觸發它們之間進行迴圈呼叫,可能導致系統崩潰。

觀察者模式沒有相應的機制讓觀察者知道所觀察的目標物件是怎麼發生變化的,而僅僅只是知道觀察目標發生了變化。

適用場景

有多個子類共有的方法,且邏輯相同。

重要的、複雜的方法,可以考慮作為模板方法。

滴滴一下,讓出行更美好

>

自從有了滴滴、快滴、uber、神舟等各大打車平台,廣大市民的出行便利了不少。但自從合併以後,補助少了,**也**了很多,不 * xx 倍甚至打不到車。。。

>

滴滴:好,第乙個月,**上調至 12.5。。。

過了不久,心裡想著:納尼,都壟斷了,還不多漲漲,果斷 15.0。。。

>

合併就是為了壟斷,再無硝煙四起的**戰,整合成統一**模式,使用者也就沒有了自由選擇權。

在這裡,滴滴相當於主題,司機相當於觀察者。

**實現

建立抽象主題

提供關於註冊、登出、通知觀察者的介面:

// subject.h

#ifndef subject_h

#define subject_h

class iobserver;

// 抽象主題

class isubject

;#endif // subject_h

建立具體主題

抽象主題的具體實現,用於管理所有的觀察者:

// concrete_subject.h

#ifndef concrete_subject_h

#define concrete_subject_h

#include "subject.h"

#include "observer.h"

#include

#include

using

namespace

std;

// 具體主題

class concretesubject : public isubject

void setprice(float price)

void attach(iobserver *observer)

void detach(iobserver *observer)

void notify()

}private:

list

m_observers; // 觀察者列表

float m_fprice; // **

};#endif // concrete_subject_h

建立抽象觀察者

提供乙個 update() 介面,用於更新**:

// observer.h

#ifndef observer_h

#define observer_h

// 抽象觀察者

class iobserver

;#endif // observer_h

建立具體觀察者

抽象觀察者的具體實現,當接收到通知後,調整對應的**:

// concrete_observer.h

#ifndef concrete_observer_h

#define concrete_observer_h

#include "observer.h"

#include

#include

using

namespace

std;

// 具體觀察者

class concreteobserver : public iobserver

void update(float price)

private:

string m_strname; // 名字

};#endif // concrete_observer_h

建立客戶端

建立主題以及對應的觀察者,並新增觀察者並更新**:

// main.cpp

#include

"concrete_subject.h"

#include

"concrete_observer.h"

#ifndef safe_delete

#define safe_delete(p) }

#endif

int main()

python觀察者模式 python 觀察者模式

python 觀察者模式 前言e 寫的倉促就不截uml類圖了,書本chapter10,p313能看到圖 一旦觀察的主題有更新,就會通知到觀察者們,下面的例子是最簡單的乙個觀察者範例,假設這是一群投機分子密切關注 軍 火 倉庫的產品與數量變動 class inventory def init self...

觀察者模式

觀察者模式 observer 完美的將觀察者和被觀察的物件分離開。舉個例子,使用者介面可以作為乙個觀察者,業務資料是被觀察者,使用者介面觀察業務資料的變化,發現資料變化後,就顯示在介面上。物件導向設計的乙個原則是 系統中的每個類將重點放在某乙個功能上,而不是其他方面。乙個物件只做一件事情,並且將他做...

觀察者模式

觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件在狀態上發生變化時,會通知所有觀察者物件,讓他們能夠自動更新自己 任何乙個模式都是離不開角色的,這裡也會有幾種角色 抽象主題角色 把所有對觀察者物件的引用儲存在乙個集合中,每個抽象主題角色都可以有任意數量的觀察...