設計模式走一遍 觀察者模式 下

2021-09-13 10:33:34 字數 2358 閱讀 3522

上篇我們講解了觀察者模式的一些知識,而且自定義觀察者模式的經典**,(傳送們:設計模式走一遍---觀察者模式(上))

這篇簡單講一下jdk自帶的觀察者模式實現**。

對於觀察者模式,jdk中提供了乙個observer介面(觀察者),乙個observable類(主題物件)。

注:被觀察者又被稱為主題物件,目標物件。
具體我們來看下原始碼。

1.觀察者介面

public inte***ce observer 

該介面相當於觀察者,裡面有乙個update(observable o, object arg)方法,observable引數是指主題物件,該引數指明該觀察者是屬於哪乙個主題物件的。

arg引數可以是任意物件,假如主題物件在傳送通知時,想要傳遞什麼資料給觀察者,那麼就可以把資料物件傳遞給arg引數。

2.主題物件類(方法有點多,我就不放英文解釋了)

//主題物件可以是介面、抽象類、具體類,我們上節說

//一般採用抽象類,不過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()

}

該具體類observable相當於主題物件,實現的主要功能就是當自己的狀態傳送改變時,通知觀察者,觀察者再根據通知,在update方法做出相應的反應。

簡單寫個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人機介面中的使用,利用這種模式使得人機介面顯示效率更高。發布者 郵局 觀察者 參與者 讀者 訂閱者 當郵局收到報社新雜誌的時候,即郵局狀態發生了改變,於是郵局把...