天天看點

設計模式之觀察者模式

  随着工作時間的越來越長,發現對設計模式缺失的壞處越來越明顯,但是當你知道某種設計模式的實作方式以後,你會發現,其實工作中早已經玩過這些東西,但是你之前并不知道它屬于設計模式的一種,今天就先介紹一種設計模式:觀察者模式,然後我們也手動實作觀察者模式以加深印象。

  觀察者模式是對象的行為模式,又叫釋出-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監聽器(Source/Listener)模式或者從屬者(Dependents)模式。觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀态上發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。

  應用場景:一個軟體系統中常常要求在某一個對象的狀态發生變化的時候,某些和它關聯的其他的對象做出相應的改變。做到這一點的設計方案有很多,但是為了使系統能夠易于複用,應該選擇低耦合的設計方案。減少對象之間的耦合有利于系統的複用,但是同時設計時需要使這些低耦合的對象之間能夠維持行為的協調一緻,保證高度的協作。觀察者模式是滿足這一要求的各種設計方案中最重要的一種。

  

設計模式之觀察者模式

  由上圖可知,觀察者模式所涉及的角色有:

  1.抽象主題角色(Subject):抽象主題角色把所有對觀察者對象的引用儲存在一個集合(比如Vector)裡,然後每個主題都可以有任何數量的觀察者。抽象主題提供的接口有:增加觀察者對象、删除觀察者對象、通知所有的觀察者對象、擷取觀察者數量、設定改變。

  2.具體主題角色(ConcreteSubject): 将有關狀态存入具體主題對象,在具體主題的内部狀态改變時,給所有注冊過的觀察者發送通知。

  3.抽象觀察者角色(Observer):為所有的具體觀察者定義一個接口,訂閱的主題改變時更新自己,這個接口叫做更新接口。

  4.具體觀察者角色(ConcreteObserver):存儲與主題自恰的狀态。具體觀察者角色實作抽象觀察者角色所要求的更新接口,以便使本身的狀态與主題的狀态向協調。如有需要,具體觀察者角色可以保持一個指向具體主題對象的引用。

1.抽象觀察者角色Observer.java接口

2.抽象主題角色Observable.java類

3.具體觀察者實作類ConcreteObserver.java類

4.具體主題實作類ConcreteSubject.java類

5.單元測試類

6.運作結果截圖:

設計模式之觀察者模式

7.說明和擴充

  在觀察者模式中,其實又細分為推模型和拉模型,所謂推模型是指,在主題類發生改變的時候,調用觀察者update()方法直接把資料通過args參數傳過去,不管觀察者是否真的需要;而拉模型是調用update()方法時,把自己傳遞給觀察者,觀察者需要什麼資料,它自己從主題對象中擷取。在我看來拉模型更加的易于擴充。

  其實,在java.util包裡面,jdk預設也給我們提供了這樣實作,其中Observer.java是觀察者抽象類,Observable.java是主題抽象類,我們可以拿來使用,其中的實作和本文的差别不大。使用時,我們隻需要基于這兩個類進行實作就可以了很簡單。推薦使用!

  通過本文,我們就了解了什麼叫觀察者模式,以及怎麼實作該模式,以及該模式的特點。以後的工作中,我們很好的結合具體場景來使用,可以說收獲滿滿!喜歡請點贊。