設計模式-觀察者模式

概念

定義了對象之間的一對多依賴,當一個對象狀態改變時,它的全部依賴者都會收到通知並自動更新。
觀察者模式又稱發佈(Publish/Subscribe)訂閱模式,模型視圖(Model/View)模式,源-監聽器模式(Source/Listener)模式或者從屬者(Dependents)模式。
出版者(主題)+ 訂閱者(觀察者)= 觀察者模式java

重要角色

抽象主題(Subject)角色:抽象主題角色把全部對觀察者對象的引用保存在一個彙集(好比Vector對象)裏,每一個主題均可以有任何數量的觀察者。抽象主題角色又叫作抽象被觀察者(Observable)角色git

具體主題(ConcreteSubject)角色:將有關狀態存入具體觀察者對象;在具體主題的內部狀態改變時,給全部登記過的觀察者發出通知。具體主題角色又叫作具體被觀察者(Concrete Observable)角色github

抽象觀察者(Observer)角色:爲全部的具體觀察者定義一個接口,在獲得主題的通知時更新本身,這個接口叫作更新接口。spa

具體觀察者(ConcreteObserver)角色:存儲與主題的狀態自恰的狀態。具體觀察者角色實現抽象觀察者角色所要求的更新接口,以便使自己的狀態與主題的狀態相協調。若是須要,具體觀察者角色能夠保持一個指向具體主題對象的引用code

UML圖

此處的UML圖與重要角色的描述有所出入,主要是由於在此處抽象主題角色採用的接口,而不是抽象類,
觀察者模式.pngserver

推模型和拉模型

在觀察者模式中,又細分爲推模型拉模型對象

推模型

 主題對象向觀察者推送主題的詳細信息,無論觀察者是否須要,推送的信息一般是主題對象的所有或部分數據。接口

拉模型

 主題對象在通知觀察者的時候,只傳遞少許信息。若是觀察者須要更具體的信息,由觀察者主動到主題對象中獲取,至關因而觀察者從主題對象中拉數據。通常這種模型的實現中,會把主題對象自身經過update()方法傳遞給觀察者,這樣在觀察者須要獲取數據的時候,就能夠經過這個引用來獲取了。rem

JDK對觀察者模式的支持

  1. java.util.Observable:可觀察者(主題)

 該類有兩個很是重要的方法,一個是setChanged(),另外一個是notifyObservers()。第一方法setChanged()被調用以後會設置一個內部標記變量,表明被觀察者對象的狀態發生了變化。第二個是notifyObservers(),這個方法被調用時,會調用全部登記過的觀察者對象的update()方法,使這些觀察者對象能夠更新本身。get

  1. java.util.Observer:觀察者<br/>

 update()方法,該方法有兩個參數,第一個參數是主題引用,第二個參數是主題調用notifyObservers()方法時傳遞的參數

代碼地址

觀察者模式代碼

package cn.sh.observer //本身實現的觀察者模式
package cn.sh.jdk.observer //利用JDK提供的有關觀察者模式的API
相關文章
相關標籤/搜索