模式是什么?
模式是一個范式,一個在相同環(huán)境或者狀況下的一種通用解決辦法,解決方案。就好像孫子兵法,對于某種特定戰(zhàn)局,戰(zhàn)況下的一種派兵布陣策略和實施步驟的總結(jié)。
模式需要什么呢?
模式需要一個名字,一個問題域(要解決的問題),要有一個解決的方案,最后要達到什么樣的結(jié)果。
長話短說,Observer模式,所要解決的問題就是,一個事物,當(dāng)它自身的狀態(tài)改變了,那么它要通知其他的事物,而它又不能夠事先知道要通知誰,只有在Runtime時才能知道。
舉個例子吧,鐘表和人的關(guān)系就是這樣,鐘表自身的狀態(tài),也就是時刻改變了,它通知某些人,某些人看到或者聽到后,會做出不同的行為。而鐘表在商店里時,并不知道要通知誰?只有買主把鐘表買回家,買主的家人注冊到這個鐘表,這時,鐘表的狀態(tài)改變才會通知到家里的人,那么家人有大人、小孩,他們看到或者聽到這個鐘表的時間改變,會有不同的行為。
那么將上面的例子可以化解為對象。鐘表是個源,它是抽象的概念,可以很多形式的表,手表、掛鐘、鬧鐘等,而家人們都是監(jiān)聽器,實現(xiàn)了監(jiān)聽器接口,監(jiān)聽器方法就是listen()和see(),當(dāng)人每個人實現(xiàn)了接口會有不同的行為,這些鐘表并不關(guān)心,它只會在整點時通知之前注冊到它內(nèi)部的家人實例的監(jiān)聽器方法。
那是什么時候注冊的呢?就是主人買回家,告訴家人這是新的鐘表,也就是Timer.registerListener(Listener l)
那么鐘表就是observable,就是那個常說的Subject,而家人就是具體的Observer,實現(xiàn)了Oberver接口的方法。





































































下面是Listner接口,是一個概念模型,提供給Timer,Timer只關(guān)心,自身改變狀態(tài)后,要調(diào)用的觀察者什么行為,并不關(guān)心觀察者本身。所以提取人的若干行為,抽象成為接口。














































































這是一個主人的類,也就是一類具體的Observer。
接口java.util.Observer和類java.util.Observable是Java本身對于觀察者模式的支持。
其實這種模式就是一種回調(diào)的應(yīng)用,就是想其它類中注冊自己的接口,到特定時候調(diào)用自己的方法。
就好像古詩詞中,“有朋自遠方來不亦樂乎”,意思是說,如果好友光臨到門口,叫一聲自己,就會很高興,也就是說,告訴朋友到達自己住處,這個狀態(tài)滿足,那么就叫一聲自己,自己就會為朋友開門,高興等行為就會進行。 如果不采用觀察者模式,那就是自己需要不斷的到門口察看朋友是否到了,是一種輪循的方式,當(dāng)然也能達到效果,但會影響自己的事情。