視察者模式定義對象間的1種1對多的依賴關系,當1個對象的狀態產生改變的時候,所有依賴于它的對象都得到通知并被自動更新。
視察者類圖:
Subject(被視察者)
被視察的對象。當需要被視察的狀態產生變化時,需要通知隊列中所有視察者對象。Subject需要保持(添加,刪除,通知)1個視察者對象的隊列列表。
ConcreteSubject
被視察者的具體實現。包括1些基本的屬性狀態及其他操作。
Observer(視察者)
接口或抽象類。當Subject的狀態產生變化時,Observer對象將通過1個callback函數得到通知。
ConcreteObserver
視察者的具體實現。得到通知后將完成1些具體的業務邏輯處理。
1.目標和視察者之間的關系:依照模式定義,目標和視察者直接是典型的1對多關系,但是如果視察者只有1個也是可以的。在處理1個對象的狀態變化會影響到另外一個對象的時候也能夠斟酌使用此模式。
2.單向依賴:在視察者模式中,視察者和目標是單向依賴的,只有視察者依賴目標,而目標是不會依賴于視察者的。它們之間的主動權掌握在目標手中。
3.實現:具體的目標實現對象要能保護視察者的注冊信息,最簡單的是采取1個機會來保存視察者的注冊信息。 如果是1個視察者視察多個目標,那末在視察者的更新方法里面,需要判斷是來自哪個目標的通知。簡單的做法就是擴大update的方法。比如在方法里面多傳遞1個參數進行辨別,還有種更簡單的方法就是定義不同的回調方法。
Java中的視察者模式
在java.util包里面有1個類Observable,它實現了大部份我們需要的目標的功能,還有1個接口Observer,它里面定義了update的方法,就是視察者的接口。