傳說,好萊塢有一條規則:別來找我,我會去找你。
觀察者模式,有兩種角色:觀察者,以及通知者(或者叫目標對象)。
當對象間存在一對多關係時,則使用觀察者模式(Observer Pattern)。比如,當一個對象被修改時,則會自動通知它的依賴對象。觀察者模式屬於行為型模式。
單談概念總是很虛,讓我們來看一個實例:
假設我們有一個商城,有這麼樣一個需求,當商城上架新的商品時,要將產品推送到各個合作商家,偽代碼如下:
![談談觀察者模式](http://p2.ttnews.xyz/loading.gif)
那麼,這樣就會有一個問題,當每增加一個合作商家,就有修改這段代碼,這肯定會後期的維護帶來一些問題。
這時候,觀察者模式就派上用場了。
這裡,商城就是我們的通知者,而各個合作商家就是觀察者。
讓我們一步步把這段代碼使用觀察者模式重構。
1.首先定義一個接口,名叫Observer,擁有一個update方法:
![談談觀察者模式](http://p2.ttnews.xyz/loading.gif)
這個接口是對各個商家的抽象,我們不關心具體你是哪個商家,只需知道你是一個observer即可。
2.接下來定義我們的商城,它應該擁有一個成員變量,來存儲合作商家。這裡,Shop需要對外暴露一個接口,這個接口可以讓外部註冊觀察者。在本個案例當中,就是合作商家通過這個接口像商城註冊。
3.最後,我們需要一個Product類,沒有具體實現,用來傳遞商品信息。
好,現在讓我們來編寫上架商品通知合作商家的代碼:
我們通過一個線程來模擬這個商城每隔1秒上架一個新商品,並推送給合作商家。
接下來,來編寫兩個合作商傢俱體實現類:
Tmall和Jd:
最後,讓我們來運行下這個商城,並把京東和天貓註冊到商城的觀察者列表裡:
運行結果:
閱讀更多 最後一個NPE 的文章