定義了對象之間的一對多依賴,當一個對象狀態改變時,它的全部依賴者都會收到通知並自動更新。
觀察者模式又稱發佈(Publish/Subscribe)訂閱模式,模型視圖(Model/View)模式,源-監聽器模式(Source/Listener)模式或者從屬者(Dependents)模式。
出版者(主題)+ 訂閱者(觀察者)= 觀察者模式java
抽象主題(Subject)角色:抽象主題角色把全部對觀察者對象的引用保存在一個彙集(好比Vector對象)裏,每一個主題均可以有任何數量的觀察者。抽象主題角色又叫作抽象被觀察者(Observable)角色。git
具體主題(ConcreteSubject)角色:將有關狀態存入具體觀察者對象;在具體主題的內部狀態改變時,給全部登記過的觀察者發出通知。具體主題角色又叫作具體被觀察者(Concrete Observable)角色。github
抽象觀察者(Observer)角色:爲全部的具體觀察者定義一個接口,在獲得主題的通知時更新本身,這個接口叫作更新接口。spa
具體觀察者(ConcreteObserver)角色:存儲與主題的狀態自恰的狀態。具體觀察者角色實現抽象觀察者角色所要求的更新接口,以便使自己的狀態與主題的狀態相協調。若是須要,具體觀察者角色能夠保持一個指向具體主題對象的引用。code
此處的UML圖與重要角色的描述有所出入,主要是由於在此處抽象主題角色採用的接口,而不是抽象類,server
在觀察者模式中,又細分爲推模型和拉模型對象
主題對象向觀察者推送主題的詳細信息,無論觀察者是否須要,推送的信息一般是主題對象的所有或部分數據。接口
主題對象在通知觀察者的時候,只傳遞少許信息。若是觀察者須要更具體的信息,由觀察者主動到主題對象中獲取,至關因而觀察者從主題對象中拉數據。通常這種模型的實現中,會把主題對象自身經過update()方法傳遞給觀察者,這樣在觀察者須要獲取數據的時候,就能夠經過這個引用來獲取了。rem
該類有兩個很是重要的方法,一個是setChanged(),另外一個是notifyObservers()。第一方法setChanged()被調用以後會設置一個內部標記變量,表明被觀察者對象的狀態發生了變化。第二個是notifyObservers(),這個方法被調用時,會調用全部登記過的觀察者對象的update()方法,使這些觀察者對象能夠更新本身。get
update()方法,該方法有兩個參數,第一個參數是主題引用,第二個參數是主題調用notifyObservers()方法時傳遞的參數。
package cn.sh.observer //本身實現的觀察者模式 package cn.sh.jdk.observer //利用JDK提供的有關觀察者模式的API