概念
定義對象間的一種一(Observable)對多(Observer)的依賴關(guān)系,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動更新。
舉個例子,一個程序員在搞開發(fā)(被觀察者),后面一群產(chǎn)品,測試,UI,運營(觀察者們)在盯著,程序員一旦完成了開發(fā),其他人就都知道了,并且開始完成后期任務(wù)。
程序員和觀察者們.jpg
觀察者模式,字面意思是被觀察者做自己的事兒,觀察者們就在旁邊看,看著做完了就做出一定的反應(yīng),但是實際在程序中,我們不是這么用的,觀察者如果時時刻刻都在盯著被觀察者,多累呀,一般都是使用的發(fā)布-訂閱模式,就是說程序員自己開發(fā)自己的功能,其他想要關(guān)心進度的人就提前告訴程序員一聲,程序員把功能開發(fā)好了,再挨個通知,功能開發(fā)完了,其他訂閱者(觀察者)再做出響應(yīng),啊,程序員真是累呀!
獻上簡易demo
具體的代碼實現(xiàn)上面需要兩個接口,一個是被觀察者接口,一個是觀察者接口,這樣便于擴展,解耦。
/**
* 被觀察者接口
*/
public interface Observable {
//添加觀察者
void attach(Observer observer);
//刪除觀察者
void detach(Observer observer);
//通知所有的觀察者
void notifyObservers();
}
/**
* 觀察者接口
*/
public interface Observer {
//更新
void update();
}
/**
* 被觀察者實現(xiàn)類(苦逼的程序員)
*/
public class Programmer implements Observable {
private List<Observer> observers = new ArrayList<>();
@Override
public void attach(Observer observer) {
observers.add(observer);
}
@Override
public void detach(Observer observer) {
observers.remove(observer);
}
public void change(){
Log.i("huan","程序員:功能終于開發(fā)完啦,哈哈哈哈");
notifyObservers();
}
@Override
public void notifyObservers() {
for(Observer observer:observers){
observer.update();
}
}
}
/**
* 觀察者實現(xiàn)類(產(chǎn)品經(jīng)理)
*/
public class PMObserver implements Observer{
@Override
public void update() {
Log.i("huan","產(chǎn)品:額,我這里想加個需求,哪里也要加個功能");
}
}
/**
* 觀察者實現(xiàn)類(測試)
*/
public class QAObserver implements Observer {
@Override
public void update() {
Log.i("huan","測試:你這個功能一定有bug,你看點這里沒有反應(yīng)。。。");
}
}
/**
* 觀察者實現(xiàn)類(運營)
*/
public class OPObserver implements Observer {
@Override
public void update() {
Log.i("huan","運營:我要去給用戶瞎掰新功能了");
}
}
Programmer programmer = new Programmer();
QAObserver qa = new QAObserver();
PMObserver pm = new PMObserver();
OPObserver op = new OPObserver();
programmer.attach(qa);
programmer.attach(pm);
programmer.attach(op);
programmer.change();
log輸出
輸出結(jié)果.png
代碼非常簡單
觀察者模式的優(yōu)缺點
優(yōu)點:解耦,觀察者雙方都依賴于接口,雙方的擴展和變化都不相互影響。
缺點:運行效率有影響,一般情況下java使用的是順序執(zhí)行,一旦一行代碼死循環(huán)下面的代碼就都無法執(zhí)行,所以這里需要做異步處理。
Android中的觀察者模式
使用的太多,這里就舉一些簡單的例子,所有控件的事件監(jiān)聽(OnClickListener)就是使用觀察者模式實現(xiàn)的,廣播(BroadcastReceiver)。