本文的參考文章及書(shū)籍:
http://cmsblogs.com/?p=5065
《head first設(shè)計(jì)模式》
1.觀察者模式概述
何為觀察者模式括细,即當(dāng)一個(gè)事物變化時(shí),觀察它的人都能接收到變化的消息敷存。例如紅燈停,綠燈行,我們監(jiān)聽(tīng)者紅燈的變化瘪贱,在變化后做出對(duì)應(yīng)的反應(yīng),又如報(bào)社和閱讀者辆毡,閱讀者訂閱報(bào)社的報(bào)紙菜秦,當(dāng)報(bào)紙出版新的新聞時(shí)候就會(huì)發(fā)布給訂閱的閱讀者,也稱為發(fā)布/訂閱舶掖。
2.觀察者模式的實(shí)現(xiàn)
假設(shè)我們來(lái)到英雄聯(lián)盟的場(chǎng)景球昨,草叢三兄弟蓋倫、德瑪眨攘、皇子為一個(gè)陣營(yíng)主慰,當(dāng)三兄弟中的其中一個(gè)受到傷害時(shí),另外兩兄弟會(huì)前去救援鲫售。這就引出了當(dāng)受傷時(shí)候得通知其他兩兄弟共螺,兄弟們得互相觀察對(duì)方是否受傷,這時(shí)候我們引入一個(gè)轉(zhuǎn)發(fā)器情竹。轉(zhuǎn)發(fā)器用來(lái)通知兄弟受傷前去救援藐不,三兄弟觀察轉(zhuǎn)發(fā)器是否發(fā)出通知。
3.具體類(lèi)的設(shè)計(jì)
? 首先定義一個(gè)被觀察者接口,只要是被觀察者實(shí)行其該接口佳吞。該接口有三個(gè)主要的方法拱雏,注冊(cè)觀察者,移除觀察者底扳,發(fā)布通知铸抑。如下圖所示:
接著定義一個(gè)觀察者接口,接口中一個(gè)update方法用來(lái)表示當(dāng)被觀察者狀態(tài)發(fā)生改變時(shí)下發(fā)通知調(diào)用此方法衷模,使觀察者發(fā)生改變鹊汛,該觀察者接口(Observer)定義如下圖所示:
定義完兩個(gè)接口后,根據(jù)業(yè)務(wù)進(jìn)行具體的實(shí)現(xiàn)阱冶,首先三兄弟蓋倫刁憋、德邦、皇子實(shí)現(xiàn)觀察者接口木蹬,當(dāng)有人受傷時(shí)前去救援至耻,具體的實(shí)現(xiàn)如下圖所示:
定義轉(zhuǎn)發(fā)器實(shí)現(xiàn)被觀察者接口,用一個(gè)list列表存放觀察者镊叁,表示要通知的對(duì)象尘颓,如本例的三兄弟,registerObserver添加三兄弟晦譬,notifyObserver通知前去救援,removeObserver根據(jù)傳參移除三兄弟中的一個(gè)疤苹。具體代碼實(shí)現(xiàn)如下圖所示:
用客戶端進(jìn)行模擬,創(chuàng)建出三兄弟實(shí)例以及轉(zhuǎn)發(fā)器敛腌,將三兄弟添加入轉(zhuǎn)發(fā)器當(dāng)中進(jìn)行觀察卧土,當(dāng)有人受傷時(shí),轉(zhuǎn)發(fā)器發(fā)出消息進(jìn)行通知像樊,如下圖所示:
JDK中也有對(duì)觀察者模式的支持具體為java.util.Observer和java.util. Observable這兩個(gè)類(lèi)尤莺,可看其具體的源碼實(shí)現(xiàn)方式。