項目鏈接:https://github.com/dipankarghosh28/Learning-Android-ObserverPattern
一.為什么使用觀察者模式
觀察者模式在實際項目中使用的也是非常頻繁的,它最常用的地方是GUI系統、訂閱——發布系統等。因為這個模式的一個重要作用就是解耦,使得它們之間的依賴性更小,甚至做到毫無依賴。以GUI系統來說,應用的UI具有易變性,尤其是前期隨着業務的改變或者產品的需求修改,應用界面也經常性變化,但是業務邏輯基本變化不大,此時,GUI系統需要一套機制來應對這種情況,使得UI層與具體的業務邏輯解耦,觀察者模式此時就派上用場了。觀察者模式又被稱作發布/訂閱模式,觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。
二.觀察者模式的結構
三.觀察者模式中的角色
抽象主題(Subject):它把所有觀察者對象的引用保存到一個聚集里,每個主題都可以有任何數量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者對象。
具體主題(ConcreteSubject):將有關狀態存入具體觀察者對象;在具體主題內部狀態改變時,給所有登記過的觀察者發出通知。
抽象觀察者(Observer):為所有的具體觀察者定義一個接口,在得到主題通知時更新自己。
具體觀察者(ConcreteObserver):實現抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題狀態協調。
四.觀察者模式示例
引用項目的鏈接:https://github.com/dipankarghosh28/Learning-Android-ObserverPattern/blob/master/ObserverTest/app/src/main/java/com/example/dipankarghosh/observertest/Test.java
1.首先定義一個繼承Observable的被觀察者Test.java類,通過setChanged()方法通知數據改變,然后通過notifyObservers()方法發送信號通知觀察者。
引用項目鏈接:https://github.com/dipankarghosh28/Learning-Android-ObserverPattern/blob/master/ObserverTest/app/src/main/java/com/example/dipankarghosh/observertest/MainActivity.java
2.當被觀察者因為數據發生了改變,並通知了相關的觀察者后,觀察者將會調用update()這個方法進行數據更新,第一個測試的activity
引用項目的鏈接:https://github.com/dipankarghosh28/Learning-Android-ObserverPattern/blob/master/ObserverTest/app/src/main/java/com/example/dipankarghosh/observertest/SecondActivity.java
3.當被觀察者因為數據發生了改變,並通知了相關的觀察者后,觀察者將會調用update()這個方法進行數據更新,第二個測試的activity
4.最后創建一個觀察者實例,我們就可以在單元測試里頭進行測試了
五.觀察者模式的優點
1.觀察者模式解除了主題和具體觀察者的耦合,讓耦合的雙方都依賴於抽象,而不是依賴具體。
2.能進行簡單的廣播通信,自動通知所有訂閱的觀察者;