1术幔、模式定義
- 觀察者模式是對(duì)象的行為模式侄柔,又叫發(fā)布-訂閱(Publish/Subscribe)模式既们、模型-視圖(Model/View)模式仲吏、源-監(jiān)聽器(Source/Listener)模式或從屬者(Dependents)模式不铆。
- 觀察者模式定義了一種一對(duì)多的依賴關(guān)系蝌焚,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象。這個(gè)主題對(duì)象在狀態(tài)上發(fā)生變化時(shí)誓斥,會(huì)通知所有觀察者對(duì)象只洒,使它們能夠自動(dòng)更新自己。
- 被觀察者 訂閱 觀察者 => Observable Subscribe Observer
2劳坑、代碼實(shí)現(xiàn)
// 觀察者接口
public interface Observer {
void update(Observable observable, Object object);
}
// 具體的觀察者
public class PoliceObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.print("狀態(tài)發(fā)生改變:");
((ThiefObservable) o).capture();
}
}
// 被觀察者管理類
public class Observable{
public Vector<Observer> observers;
public Observable() {
observers = new Vector<Observer>();
}
public void addObserver(Observer observer) {
if (observers == null) return;
observers.add(observer);
}
public void removeObserver(Observer observer) {
if (observers == null && observers.size() <= 0) {
return;
}
observers.remove(observer);
}
public void notifyObservables() {
notifyObservables(null);
}
public void notifyObservables(Object object) {
if (observers == null && observers.size() <= 0) {
return;
}
for (Observer observer : observers) {
observer.update(this, object);
}
}
}
// 具體的被觀察者
public class ThiefObservable extends Observable {
public void steal() {
System.out.println("小偷準(zhǔn)備偷東西了");
notifyObservables();
}
public void capture() {
System.out.println("小偷被抓");
}
}
public class TestDemo {
public static void main(String[] args) {
// 創(chuàng)建被觀察者對(duì)象
ThiefObservable thiefObservable = new ThiefObservable();
// 創(chuàng)建觀察者對(duì)象毕谴,并將被觀察者對(duì)象登記
PoliceObserver policeObserver = new PoliceObserver();
// 被觀察者訂閱觀察者
thiefObservable.addObserver(policeObserver);
// 被觀察者執(zhí)行某些操作
thiefObservable.steal();
// 取消被觀察者與觀察者之間的訂閱關(guān)系
thiefObservable.removeObserver(policeObserver);
// 被觀察者執(zhí)行某些操作
thiefObservable.steal();
}
}
=====================================================
運(yùn)行結(jié)果:
小偷準(zhǔn)備偷東西了
狀態(tài)發(fā)生改變:小偷被抓
小偷準(zhǔn)備偷東西了
=====================================================
3、常見使用場(chǎng)景
- java.util庫提供了一個(gè)Observable類以及一個(gè)Observer接口距芬。
- RxJava涝开。
4、優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn):(1)觀察者模式符合松耦合框仔。(2)觀察者不會(huì)因主動(dòng)獲取通知而錯(cuò)過狀態(tài)舀武。(3)表示層和數(shù)據(jù)邏輯層的分離。
- 缺點(diǎn):(1)通知觀察者的時(shí)間花費(fèi)离斩。(2)多個(gè)被通知者間循環(huán)可能發(fā)生死鎖银舱。(3)主題持有觀察者的引用,如果未正常處理從主題中刪除觀察者跛梗,會(huì)導(dǎo)致觀察者無法被回收寻馏。
5、參考資料
- java.util庫中的Observable類和Observer接口源碼
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者