C 設計模式之觀察者模式例項講解

2022-09-26 08:09:12 字數 3288 閱讀 1916

前言

最近開始花點心思研究下設計模式,主要還是讓自己寫的**可重用性高、保證**可靠性。所謂設計模式,我找了下定義:是一套被反覆使用、多數人知曉的、經過分類編目的、**設計經驗的總結。毫無疑問,設計模式於己於他人於系統都是多贏的;設計模式使**編制真正工程化;設計模式是軟體工程的基石脈絡,如同大廈的結構一樣。

為什麼要提倡「design pattern(設計模式)」?

根本原因是為了**復用,增加可維護性。因此這次我們來學習下設計模式,最後會通過c#語言來實現這些設計模式作為例子,深刻理解其中的精髓。

定義觀察者模式,有時被稱作發布/訂閱模式,觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件在狀態發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己。

特點模式中具有的角色

1。 抽象主題(subject):它把所有觀察者物件的引用儲存到乙個聚集裡,每個主題都可以有任何數量的觀察者。抽象主題提供乙個介面www.cppcns.com,可以增加和刪除觀察者物件。

2。 具體主題(concretesubject):將有關狀態存入具體觀察者物件;在具體主題內部狀態改變時,給所有登記過的觀察者發出通知。

3。抽象觀察者(observer):為所有的具體觀察者定義乙個介面,在得到主題通知時更新自己。

4。具體觀察者(concreteobserver):實現抽象觀察者角色所要求的更新介面,以便使本身的狀態與主題狀態協調。

優缺點優點:一、通知通訊

觀察者模式支援廣播通訊。被觀察者會向所有的註冊過的觀察者發出通知。

二、聚耦合

觀察者模式在被觀察者和觀察者之間建立了乙個抽象的耦合,被觀察者並不知道任何乙個具體的觀察者,只是儲存著抽象觀察者的列表,每個具體觀察者都符合乙個抽象觀察者的介面。

缺點:一、時間複雜度

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

二、內聯不足

雖然觀察者模式可以隨時使觀察者知道所觀察的物件傳送了變化,但是觀察者模式沒有相應的機制使觀察者知道所觀察的物件是怎樣發生變化的。

三、容易出現迴圈呼叫

如果在被觀察者之間有迴圈依賴的話,被觀察者會觸發它們之間進行迴圈呼叫,導致系統崩潰,在使用觀察者模式應特別注意這點。

實現思路

下面以xmfdsh發布一篇部落格的例子來說明觀察者模式的實現。關注了xmfdsh的朋友們,便可以通過觀察者模式來實時得到部落格進行了更新的資訊。當乙個抽象模型有兩個方面,其中乙個方面依賴於另乙個方面,將這兩者封裝在獨立的物件中以使它們可以各自獨立地改變和復用的情況下。從方面的這個詞中可以想到,觀察者模式肯定在aop(面向方面程式設計)中有所體現。因此這種需求使用觀察者模式來解決就再恰當不過了。

觀察者向目標「訂閱」它的改變,而目標發生改變後就「通知」所有已經「訂閱」了它的改變的觀察者,從而執行「訂閱」的內容。這種機制的好處在於降低耦合度,分工明確,目標只負責在自身狀態發生改變或做出某種行為時向自身的訂閱清單發出「通知」,而不是直接呼叫觀察者的行為(方法);觀察者只負責向目標「訂閱」它的變化,以及定義自身在收到目標「通知」後所需要做出的具體行為(也就是訂閱的內容)

複製** **如下:

// 訂閱號抽象類

public abstract class blog

//描寫訂閱號的相關資訊

public string info //描寫此次update的資訊

public blog(string symbol, string info)

// 對同乙個訂閱號,新增和刪除訂閱者的操作

public void addobserver(iobserver ob)

public void removeobserver(iobserver ob)

public void update()}}

}// 具體訂閱號類

public class myblog : blog

}// 訂閱者介面

public inte***ce iobserver

// 具體的訂閱者類

public class subscriber : iobserver

public subscriber(string name)

public void receive(blog xmfdsh)

觀察到了", name, xmfdsh.symbol, xmfdsh.info);}}

// 客戶端測試

class program

}執行的效果圖如下:

此類實現方法的類圖如下:

這個類圖是visual studio生成的,可能看起來比較混亂把,這樣的實現就是觀察者模式的實現。任何時候,只要執行了update方法,便會自動的去通知推送給訂閱了此訂閱號 的使用者,然而在c#中,我們更多的是使用委託與事件來簡化觀察者模式的實現。

複製** **如下:

class program

//描寫訂閱號的相關資訊

public string info //描寫此次update的資訊

public blog(string symbol, string info)

#region 新增對訂閱號列表的維護操作

public void addobserver(notifyeventhandler ob)

public void removeobserver(notifyeventhandler ob)

#endregion

public void update()}}

// 具體訂閱號類

public class myblog : blog

}// 具體訂閱者類

public class subscriber

public subscriber(string name)

public void receive(object obj)

觀察到了", name, xmfdsh.symbol, xmfdsh.info);}}

}static void main1(string args)

}執行的結果:

類圖:總結

到這裡,觀察者模式就講完了,觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件可以同時監聽某乙個主題物件,這個主題物件在發生狀態變化時,會通知所有觀察者物件,使它們能夠自動更新自己,因此在一些需求上是當乙個物件的改變需要同時改變多個其他物件的時候,且不知道多少個物件需要去通知改變的時候,觀察者模式就成了首選,這種模式的用的最多的,在我的開發經歷中便是windows phone手機客戶端的開發了,經常要用到這類的委託事件的處理,用多了後發現就習以為常,這種模式也就沒那麼稀奇了。

原始碼**位址:

本文標題: c#設計模式之觀察者模式例項講解

本文位址:

c 設計模式之觀察者模式

觀察者模式 observer 定義 觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件在狀態上發生變化時,會通知所有觀察者物件,讓它們能夠自動更新自己。觀察者模式類結構圖 觀察者模式的角色 subject抽象主題角色 把所有對觀察者物件的引用儲存在乙個集合中,...

c 設計模式之觀察者模式

觀察者模式定義了物件間的一對多依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都會得到通知並自動更新.觀察者與被觀察者之間使用松耦合方式結合 主題是真正擁有資料的人,觀察者是主題的依賴者,在資料變化時更新,比許多物件控制同乙份資料更乾淨 class observer 觀察者介面 class ...

C 設計模式之觀察者模式

觀察者設計模式定義了物件間的一對多的依賴關係,乙個物件的行為依賴於另乙個物件的狀態的情況下,當物件狀態發生變化時,依賴它的物件會得到通知並自動重新整理。觀察者模式中主要有兩種角色 觀察者和監聽者 觀察者主要是在事件到來時,通知對於該事件感興趣的監聽者來處理事件。所以它的職責也就顯而易見了 通知觀察者...