上篇我們講解了觀察者模式的一些知識,而且自定義觀察者模式的經典**,(傳送們:設計模式走一遍---觀察者模式(上))
這篇簡單講一下jdk自帶的觀察者模式實現**。
對於觀察者模式,jdk中提供了乙個observer介面(觀察者),乙個observable類(主題物件)。
注:被觀察者又被稱為主題物件,目標物件。具體我們來看下原始碼。
1.觀察者介面
public inte***ce observer
該介面相當於觀察者,裡面有乙個update(observable o, object arg)方法,observable引數是指主題物件,該引數指明該觀察者是屬於哪乙個主題物件的。
arg引數可以是任意物件,假如主題物件在傳送通知時,想要傳遞什麼資料給觀察者,那麼就可以把資料物件傳遞給arg引數。
2.主題物件類(方法有點多,我就不放英文解釋了)
//主題物件可以是介面、抽象類、具體類,我們上節說該具體類observable相當於主題物件,實現的主要功能就是當自己的狀態傳送改變時,通知觀察者,觀察者再根據通知,在update方法做出相應的反應。//一般採用抽象類,不過jdk這裡使用的是具體類
public class observable
//新增乙個觀察者
public synchronized void addobserver(observer o)
}//刪除乙個觀察者
public synchronized void deleteobserver(observer o)
//標記該物件的狀態是否傳送了改變
protected synchronized void setchanged()
//指示該物件不會再發生改變,或者它已經通知了
//所有觀察者
protected synchronized void clearchanged()
//測試物件是否發生了改變。當且僅當在此物件最近
//呼叫了setchange()方法
public synchronized boolean haschanged()
//如果haschanged()方法指示此物件傳送了改變,
//則通知所有觀察者,並且呼叫clearchanged()方法
//指示此物件不再改變
public void notifyobservers()
//與上面沒有引數的同名方法相同,只是如果這個方
//法的arg引數可以接受主題物件想要傳遞觀察者的資料物件
public void notifyobservers(object arg)
for (int i = arrlocal.length-1; i>=0; i--)
((observer)arrlocal[i]).update(this, arg);
}//刪除所有觀察者
public synchronized void deleteobservers()
//返回觀察者的數量
public synchronized int countobservers()
}
簡單寫個demo測試下。
public class test
}//動物主題,弄子類方便拓展主題物件功能
class animalsubject extends observable
}class dogobsever implements observer
}class lionobsever implements observer
}
列印結果
收到通知,獅子觀察者正在做出相應處理
收到通知,小狗觀察者正在做出相應處理
從上面的**中我們可以發現jdk內建的觀察者模式中的主題物件是乙個具體類,而不是乙個抽象類或介面,而且setchange()方法還被保護起來了(被定義為protected),這就意味著,要在別的類中呼叫該方法,那麼我們必須繼承在子類中重寫覆蓋該方法。顯然,我覺得這很不友好.....
可能這也是jdk內建的觀察者模式很少被拿來使用 的原因吧,一般都是自己來自定義觀察者模式。
希望大家能夠動手寫一下這些**,可能會碰到一些你沒想到的問題。
完
關注公我的眾號:
python 設計模式 觀察者 觀察者設計模式
在觀察者設計模式這種模式中,物件被表示為等待事件觸發的觀察者。一旦發生指定的事件,觀察者就會關注該主體。當事件發生時,主體告訴觀察者它已經發生。以下uml圖表示觀察者模式 如何實現觀察者模式?現在讓我們來看看如何實現觀察者模式。參考以下實現 import threading import time ...
設計模式 一 觀察者模式
首先,給出觀察者模式的定義 觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件在狀態發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己。在這種模式中,有兩個比較關鍵的術語 觀察者 和 主題 或者叫抽象通知者 如何理解?在這裡,我舉乙個例子。每每學到這種設...
設計模式 觀察者模式
觀察者模式定義了物件間一對多的依賴關係,乙個物件發生變化時,所有依賴它的物件都得到通知並被自動更新。本文主要闡述觀察者模式在分布式scada人機介面中的使用,利用這種模式使得人機介面顯示效率更高。發布者 郵局 觀察者 參與者 讀者 訂閱者 當郵局收到報社新雜誌的時候,即郵局狀態發生了改變,於是郵局把...