C 之觀察者模式

2022-06-14 14:06:06 字數 1716 閱讀 3703

優點:1、觀察者和被觀察者是抽象耦合的。 2、可以建立一套觸發機制。

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

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

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

設計骨架如下:

各個角色解釋如下:

抽象subject角色:抽象主題角色提供維護乙個觀察者物件集合的操作方法,對集合的增加、刪除等。

具體concretesubject角色:將有關狀態存入具體的觀察者物件;在具體主題的內部狀態改變時,給所有登記過的觀察者發通知。具體主題角色負責實現抽象基類中的方法。

抽象observer角色:為具體觀察者提供乙個更新介面。

具體concreteobserver角色:儲存自身的狀態,實現抽象觀察者提供的更新改變的介面。

舉乙個老闆與職員的例子,在某it公司的上午,有幾個員工在上班偷偷划水,但怕被老闆發現,他們讓離老闆辦公室最近的小a負責望風,當老闆來時,通知小b,小c,小d他們做出改變。要程式設計來描述這個過程,這裡就可以用觀察者模式來實現了,把小a當做subject,其他要通知的員工則是observer,**如下:

#include #include

using

namespace

std;

class

observer;

//抽象被觀察者

class

subject

void setstate(string

state)

protected

: vector

ob;

string

state_;

};//

具體被觀察者

class concretesubject : public

subject

void detach(observer *pobserver)

void

notify();

};//

抽象觀察者

class

observer

virtual

void update() = 0;};

//核心操作:迴圈通知所有觀察者

void

concretesubject::notify()

//具體觀察者1

class observer1 : public

observer

virtual

void

update()

};//

具體觀察者2

class observer2 : public

observer

virtual

void

update()

};//

具體觀察者2

class observer3 : public

observer

virtual

void

update()

};int

main()

c 之觀察者模式

以下均摘自 大話設計模式 這本書,供大家一起學習和交流,感謝作者。觀察者模式又叫做發布 訂閱模式 其定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件狀態發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己。觀察者模式結構圖 subject類,可翻譯為主題或者抽象統...

C 之 觀察者模式

觀察者模式用途非常多,比如阿里雲的很多服務都是以觀察者模式提供的。觀察者模式 subject 主題 observer觀察者 又叫發布的訂閱模式 publish 發布 subscribe訂閱 解決的問題是一對多的一種關係,核心就是每當乙個物件改變狀態,則所有依賴於他的物件都得得到通知並自動更新。結合實...

C 觀察者模式

觀察者模式 有時被稱作發布 訂閱模式,觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件在狀態發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己。作用 在大的專案中,當乙個物件的狀態發生改變時可以通知其他相關的物件,這就可以用到觀察者模式。用以將多種物件...