觀察者模式中有主題(Subject)和觀察者(Observer),分別對應(yīng)報社和訂閱用戶(你).觀察者模式定義了對象之間的一對多的依賴關(guān)系,這樣,當(dāng)"一"的一方狀態(tài)發(fā)生變化時,它所依賴的"多"的一方都會收到通知并且自動更新.如圖:
Android開發(fā)中經(jīng)常用到:
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
這段代碼中 mBtn 是被觀察者, OnClickListener 是觀察者。 二者通過setOnClickListener() 方法達(dá)成訂閱關(guān)系梦裂。setOnClickListener方法使得mBtn保存了調(diào)用onClick()方法的機(jī)會告匠。至于mBtn怎么去調(diào)用onClick方法就看mBtn怎么去實現(xiàn)了,很明顯當(dāng)mBtn被點擊的時候著隆,就會去判斷是否注冊了onClick方法扰楼,如果有就調(diào)用。
總結(jié)起來就是:
(Button-> 被觀察者( Observable)旅东、OnClickListener ->觀察者(Observer)灭抑、setOnClickListener() ->訂閱(subscribe),onClick() -> 事件(event))
觀察者模式抽象出來就是: Observable.subscribe(Observer)
介紹
觀察者模式也被稱為發(fā)布-訂閱(Publish/Subscribe)模式抵代,它屬于行為型模式的一種腾节。觀察者模式定義了一種一對多的依賴關(guān)系,一個主題對象可被多個觀察者對象同時監(jiān)聽荤牍。當(dāng)這個主題對象狀態(tài)變化時案腺,會通知所有觀察者對象并作出相應(yīng)處理邏輯。
UML
觀察者模式定義了四種角色:抽象主題康吵、具體主題劈榨、抽象觀察者、具體觀察者晦嵌。
- 抽象主題(Subject):該角色是一個抽象類或接口同辣,定義了增加、刪除惭载、通知觀察者對象的方法旱函。
- 具體主題(ConcreteSubject):該角色繼承或?qū)崿F(xiàn)了抽象主題,定義了一個集合存入注冊過的具體觀察者對象描滔,在具體主題的內(nèi)部狀態(tài)發(fā)生改變時棒妨,給所有注冊過的觀察者發(fā)送通知。
- 抽象觀察者(Observer):該角色是具體觀察者的抽象類含长,定義了一個更新方法券腔。
- 具體觀察者(ConcrereObserver):該角色是具體的觀察者對象,在得到具體主題更改通知時更新自身的狀態(tài)拘泞。
實現(xiàn)代碼
抽象觀察者(Observer)接口
public interface Observer {
public void update(String msg, TextView tv);
}
具體觀察者(Person)類
public class Person implements Observer {
// 用戶名
private String name;
public Person(String name) {
this.name = name;
}
@Override
public void update(String msg, TextView tv) {
tv.setText(tv.getText()+name+":"+ msg +"\n");
}
}
抽象主題(Subject)或者說是 被觀察者 (Observerable) 接口
public interface Subject {
/**
* 增加觀察者
* @param observer
*/
public void attach(Observer observer);
/**
* 刪除觀察者
* @param observer
*/
public void detach(Observer observer);
/**
* 通知觀察者
*/
public void notify(String message, TextView v);
}
具體主題(XiaosongSubject)類
public class XiaosongSubject implements Subject {
//用于保存訂閱了小嵩的博客的用戶
private List<Observer> mPersonList = new ArrayList<>();
@Override
public void attach(Observer observer) {
mPersonList.add(observer);
}
@Override
public void detach(Observer observer) {
mPersonList.remove(observer);
}
@Override
public void notify(String message, TextView tv) {
for (Observer observer : mPersonList) {
observer.update(message,tv);
}
}
}
測試代碼
總結(jié)
在Android中纷纫,有很多場景使用了觀察者模式,比如Android的源碼里:OnClickListener田弥、ContentObserver涛酗、android.database.Observable等;還有第三方開源庫EventBus、RxJava商叹、RxAndroid等燕刻。