1.觀察者模式簡介
觀察者模式是一種一對多的依賴關(guān)系咆课,讓多個觀察者對象同時監(jiān)聽某一個主題對象锥余,當這個主題對象發(fā)生改變的時候,會通知 所有的觀察者對象张症,讓他們可以及時的自動更新检疫。
觀察者中的角色:
- Subject:抽象主題(抽象被觀察者)讶请,抽象主題角色把所有觀察者對象保存在一個集合里,每個主題都可以有任意數(shù)量的觀察者屎媳,抽象主題提供一個接口夺溢,可以增加和刪除觀察者對象。
- ConcreteSubject:具體主題(具體被觀察者)烛谊,該角色將有關(guān)狀態(tài)存入具體觀察者對象风响,在具體主題的內(nèi)部狀態(tài)發(fā)生改變時,給所有注冊過的觀察者發(fā)送通知丹禀。
- Observer:抽象觀察者状勤,是觀察者者的抽象類,它定義了一個更新接口双泪,使得在得到主題更改通知時更新自己持搜。
- ConcrereObserver:具體觀察者,實現(xiàn)抽象觀察者定義的更新接口焙矛,以便在得到主題更改通知時更新自身的狀態(tài)朵诫。
2.觀察者模式簡單實現(xiàn)
抽象觀察者(Observer)
里面定義了一個更新的方法
public interface Observer {
public void update(String message);
}
具體觀察者(ConcrereObserver)
微信用戶是觀察者,里面實現(xiàn)了更新的方法
public class WeixinUser implements Observer {
private String name;
public WeixinUser(String name) {
this.name = name;
}
@Override
public void update(String message) {
}
}
抽象被觀察者(Subject)
抽象主題薄扁,提供了attach剪返、detach、notify三個方法
public interface Subject {
/**
* 增加訂閱者
*
* @param observer
*/
public void attach(Observer observer);
/**
* 刪除訂閱者
*
* @param observer
*/
public void detach(Observer observer);
/**
* 通知訂閱者
*
* @param message
*/
public void notify(String message);
}
具體被觀察者(ConcreteSubject)
微信公眾號是具體主題(具體被觀察者)邓梅,里面存儲了訂閱該公眾號的微信用戶脱盲,并實現(xiàn)了抽象主題中的方法
public class SubscriptionSubject implements Subject {
//存儲觀察者集合
private List<Observer> weixinUserlist = new ArrayList<>();
@Override
public void attach(Observer observer) {
weixinUserlist.add(observer);
}
@Override
public void detach(Observer observer) {
weixinUserlist .remove(observer);
}
@Override
public void notify(String message) {
for (Observer observer : weixinUserlist ) {
observer.update(message);
}
}
}
客戶端調(diào)用
public class Client {
public static void main(String[] args) {
SubscriptionSubject mSubscriptionSubject = new SubscriptionSubject();
//創(chuàng)建微信用戶
WeixinUser user1 = new WeixinUser("楊影楓");
WeixinUser user2 = new WeixinUser("月眉兒");
WeixinUser user3 = new WeixinUser("紫軒");
//訂閱公眾號
mSubscriptionSubject.attach(user1);
mSubscriptionSubject.attach(user2);
mSubscriptionSubject.attach(user3);
//公眾號更新發(fā)出消息給訂閱的微信用戶
mSubscriptionSubject.notify("劉望舒的專欄更新了");
}
}
3.使用觀察者模式的場景和優(yōu)缺點
使用場景
- 關(guān)聯(lián)行為場景,需要注意的是日缨,關(guān)聯(lián)行為是可拆分的钱反,而不是“組合”關(guān)系。
- 事件多級觸發(fā)場景匣距。
- 跨系統(tǒng)的消息交換場景面哥,如消息隊列、事件總線的處理機制毅待。
優(yōu)點
解除耦合码倦,讓耦合的雙方都依賴于抽象棺蛛,從而使得各自的變換都不會影響另一邊的變換。
缺點
在應用觀察者模式時需要考慮一下開發(fā)效率和運行效率的問題,程序中包括一個被觀察者莲组、多個觀察者,開發(fā)窃植、調(diào)試等內(nèi)容會比較復雜永罚,而且在Java中消息的通知一般是順序執(zhí)行,那么一個觀察者卡頓盅蝗,會影響整體的執(zhí)行效率鳖链,在這種情況下,一般會采用異步實現(xiàn)墩莫。
4.Android中的觀察者模式
android源碼中也有很多使用了觀察者模式芙委,比如OnClickListener、ContentObserver贼穆、android.database.Observable等题山;還有組件通訊庫RxJava、RxAndroid故痊、EventBus.