23種設計模式之觀察者模式,一文就能理解

原創鏈接:https://baijiahao.baidu.com/s?id=1639044219412817957&wfr=spider&for=pc

我們在電視上都看過這樣一個場景,一個小孩拿着報紙在街上吆喝着,“賣報了,賣報了,xx鬼子侵佔了中國東三省,張學良拱手讓人”。然後想細看內容的人就會買一份報紙。又或者我們肯定都存在着這樣一個羣,這個微信羣專門用於通知消息的,只要羣裏一有消息,我們就會知道。不管是我們訂閱報紙的過程,還是接受羣通知的過程,這其實就是觀察者模式的靈活體現。這篇文章一起來分析瞭解一下觀察者模式。

一、認識觀察者模式

首先我們給出觀察者模式的定義:

觀察者模式(又被稱爲發佈-訂閱(Publish/Subscribe)模式,屬於行爲型模式的一種,它定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態變化時,會通知所有的觀察者對象,使他們能夠自動更新自己。

概念很清晰,我們舉個例子來理解一下觀察者模式的含義,我們都在新浪微博中關注過某一位明星(假設,當然很多人已經不玩微博了),每當這位明星發佈一條動態時候,他的粉絲就都會知道。我們使用一張圖來表示一下他們的關係。

 

上面這位明星在新浪微博上發了一條動態,說他會唱、跳rap等等。然後他的粉絲就都知道了。從這個例子中我們可以看到,這裏包含了兩種人,第一種是明星,第二個是粉絲。轉化爲設計模式中的語言就是主題和觀察者。

我們的明星的微博就相當於與一個主題,粉絲就是觀察者,隨時觀察明星的動態。不過明星有權利讓你關注,也有權利把你拉黑。現在我們從類圖的角度來看一下:

從上面我們可以看到,這裏麪包含了兩大類(主題和觀察者)一共四個角色:

(1)Subject:抽象主題,他把所有觀察者對象保存在一個集合裏,可以有任意數量的觀察者,抽象主題提供一個接口,可以增加和刪除觀察者對象。意思就是明星把所有的粉絲都保存在一個賬號裏面,粉絲數量不限,可以新增粉絲也可以拉黑粉絲。

(2)ConcreteSubject:具體主題,該角色將有關狀態存入具體觀察者對象,在具體主題的內部狀態發生改變時,給所有註冊過的觀察者發送通知。意思是我們的明星一有動態,就會把消息給粉絲。

(3)Observer:抽象觀察者,是觀察者者的抽象類,它定義了一個更新接口,使得在得到主題更改通知時更新自己。這就是我們所有粉絲的抽象。

(4)ConcrereObserver:具體觀察者,實現抽象觀察者定義的更新接口,以便在得到主題更改通知時更新自身的狀態。具體每一個粉絲。

觀察者模式還是比較簡單的,就是一個粉絲關注明星的實例。現在代碼來實現一下。

二、代碼實現觀察者模式

這個例子我們還是那上面的例子來解釋說明。

第一步:定義抽象觀察者(Observer):抽象的粉絲

第二步:具體的觀察者(concreteObserver):具體的粉絲

第三步:定義抽象主題(Subject):抽象明星

第四步:具體主題(ConcreteSubject):具體的明星

第五步:測試

代碼就這麼多,說起來這個觀察者模式還是很簡單的。下面我們就來分析一下這個觀察者模式

三、分析觀察者模式

觀察者模式的主要優點在於可以實現表示層和數據邏輯層的分離,並在觀察目標和觀察者之間建立一個抽象的耦合,支持廣播通信;其主要缺點在於如果一個觀察目標對象有很多直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間,而且如果在觀察者和觀察目標之間有循環依賴的話,觀察目標會觸發它們之間進行循環調用,可能導致系統崩潰。

其實還有一點需要我們去了解,在上面的例子當中我們的會發現,其實粉絲的消息是明星推過來的,還有一種觀察者模式,也就是我們的粉絲主動去獲取消息。

(1)推模型: 主題對象向觀察者推送主題的詳細信息,不管是否需要。

(2)拉模型:主題對象在通知觀察者的時候,只傳遞少量信息。如果觀察者需要更具體的信息,由觀察者主動到主題對象中獲取。

OK。觀察者模式就先到這,如有問題還請批評指正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章