c 設計模式 觀察者模式

2022-07-04 08:51:09 字數 3695 閱讀 6910

observer 與 subject互為耦合,但是這種耦合的雙方都依賴於抽象,而不依賴於具體。

一、觀察者模式

目的

我們都知道解決乙個問題有n種解決方式,但在物件導向的設計中如何能做到「高內聚,低耦合」,設計可重用的物件才是我們追求的。在設計過程中,我們經常會接觸到一種情況:乙個物件的行為引發其它多個物件相應的行為。這時我們便可以通過觀察者模式的設計思想來設計物件模型。

概述

觀察者模式(observer pattern)是設計模式中行為模式的一種,它解決了上述具有一對多依賴關係的物件的重用問題。此模式的參與者分為兩大類,一類是被觀察的目標,另一類是觀察該目標的觀察者們。正因為該模式是基於「一對多」的關係,所以該模式一般是應用於由乙個目標物件和n個觀察者物件組成(當然也可以擴充套件為有多個目標物件,但我們現在只討論前者)的場合。當目標物件的狀態發生改變或做出某種行為時,正在觀察該目標物件的觀察者們將自動地、連鎖地作出相應的響應行為。

原理

我們可以把觀察目標理解為主動方、發布方、主體等;把觀察者理解為被動方、訂閱方、觀察器等。目標是整個行為鏈的源頭,其它觀察者都依賴於它的變化而作出響應。為了實現低耦合,我們不能使用「直接呼叫」的方式而需要利用「訂閱(清單)-通知」的機制去完成設計。通俗地說就是觀察者向目標「訂閱」它的改變,而目標發生改變後就「通知」所有已經「訂閱」了它的改變的觀察者,從而執行「訂閱」的內容。這種機制的好處在於降低耦合度,分工明確,目標只負責在自身狀態發生改變或做出某種行為時向自身的訂閱清單發出「通知」,而不是直接呼叫觀察者的行為(方法);觀察者只負責向目標「訂閱」它的變化,以及定義自身在收到目標「通知」後所需要做出的具體行為(也就是訂閱的內容)。就像我們向出版社訂閱報刊一樣,出版社有新一期報刊發行時並不是直接跟每位訂閱者聯絡,而是「通知」訂閱者名單按順序給每位訂閱者傳送所訂報刊。

二、c#中的觀察者模式

概述

每種程式設計架構及程式語言,對觀察者模式都有不通的具體實現。在.net框架中,c#語言使用委託以及事件,可以很好的實現觀察者模式。委託相當於「訂閱清單」的角色,當目標中關聯了該委託的事件被觸發時,則委託將自動按序執行觀察者註冊於委託中的方法。

模型與觀察者基類

我們把觀察者模式的參與者都描述為派生自模型及觀察者二個抽象基類的類。模型規劃了事件,而觀察者則規劃了訂閱及行為。

模型需要做的只是宣告委託以及宣告委託型別的事件。當然,還可以附加上封裝了觸發委託事件的方法。所有派生自模型的類都是具體目標,它們所要做的只是在適當的場合觸發事件。(即發出「通知」)。

在觀察者基類中,我們通過構造器將抽象的響應方法註冊(訂閱)於委託事件中。所有派生自觀察者基類的類都是具體觀察者。因為訂閱行為已經在抽象基類完成,具體觀察者需要做的只是通過覆蓋觀察者基類的方法去定義具體需要響應的行為,和通過構造器把需要觀察的具體目標傳遞給基類構造器。

優點

通過對模型與觀察者基類的分析可知,委託與事件的機制幾乎消除了這兩個模組之間的耦合,靈活性提高了很多。如果需要增加觀察者,則只需要覆蓋基類抽象方法及把觀察目標傳遞給基類。

三、事例

題目:貓大叫,兩隻老鼠開始逃跑,主人醒來,寶寶也醒來了並且哭了起來。

解決方案:

建立模型(目標基類)

namespace

delegateevent

}}

建立觀察者基類(單行為,多行為)

//

--------------------單行為---------------------

namespace

delegateevent

//////

規劃了觀察者的一種行為(方法),所有派生於該觀察者基類的具體觀察者都

///通過覆蓋該方法來實現作出響應的行為.

/// public

abstract

void

response();

}}

//

-------------------多行為-------------------

namespace

delegateevent

//////

規劃了觀察者的二種行為(方法),所有派生於該觀察者基類的具體觀察者都

///通過覆蓋該方法來實現作出響應的行為.

/// public

abstract

void

response();

public

abstract

void

response2();

}}

建立具體目標

using

system;

namespace

delegateevent

}}

建立具體觀察者

//

--------------具體觀察者(老鼠)-------------

using

system;

namespace

delegateevent

//////

覆蓋了該類觀察者需要作出的具體響應行為.

///此行為已在觀察者基類中註冊於委託事件,由委託事件排程執行,不需要直接呼叫.

/// public

override

void

response()

}}

//

----------------具體觀察者(主人)----------------

using

system;

namespace

delegateevent

//////

覆蓋了該類觀察者需要作出的具體響應行為.

///此行為已在觀察者基類中註冊於委託事件,由委託事件排程執行,不需要直接呼叫.

/// public

override

void

response()

}}

//

-------------------具體觀察者(寶寶)-------------

using

system;

namespace

delegateevent

//////

覆蓋了該類觀察者需要作出的具體響應行為.

///此行為已在觀察者基類中註冊於委託事件,由委託事件排程執行,不需要直接呼叫.

/// public

override

void

response()

//////

覆蓋了該類觀察者需要作出的另乙個響應行為.

/// public

override

void

response2()

}}

執行測試

using

system;

namespace

delegateevent

}}

python 設計模式 觀察者 觀察者設計模式

在觀察者設計模式這種模式中,物件被表示為等待事件觸發的觀察者。一旦發生指定的事件,觀察者就會關注該主體。當事件發生時,主體告訴觀察者它已經發生。以下uml圖表示觀察者模式 如何實現觀察者模式?現在讓我們來看看如何實現觀察者模式。參考以下實現 import threading import time ...

C 設計模式 觀察者模式

觀察者模式 也可以稱為通知者模式,訂閱 發布模式 模型 檢視模式 大致概念 乙個主題 theme 多個觀察者 observer 收聽它。就好比 春節聯歡晚會 theme 全國觀眾 observer 現場直播。那麼我們怎樣看直播呢?沒有電視你看的成嗎?有電視,但是沒有全國直播,你看的成嗎?好了,這樣說...

C 設計模式 觀察者模式

二.實現 比如熱水器在燒水的過程中,當水溫即將燒開時,會發出報警的聲音,顯示器上會出現溫度監控 public inte ce iobserver iobserverable介面 public inte ce iobservable 抽象基類 public abstract class subject...