定義

觀察者模式(有時(shí)又被稱(chēng)為發(fā)布(publish)-訂閱(Subscribe)模式,在此種模式中,一個(gè)目標(biāo)物件管理所有相依于它的觀察者物件,并且在它本身的狀態(tài)改變時(shí)主動(dòng)發(fā)出通知。這通常透過(guò)呼叫各觀察者所提供的方法來(lái)實(shí)現(xiàn)。此種模式通常被用來(lái)實(shí)現(xiàn)事件處理系統(tǒng)(摘自百度百科)。

關(guān)鍵詞:發(fā)布-訂閱

為什么只有一個(gè)關(guān)鍵詞?因?yàn)槲矣X(jué)得一個(gè)關(guān)鍵詞足夠說(shuō)明問(wèn)題了。觀察者模式適用于,一個(gè)對(duì)象改變時(shí),需要通知一個(gè)或多個(gè)其他對(duì)象,而需要通知的對(duì)象的特點(diǎn)是:數(shù)量不清楚,類(lèi)型不清楚(僅實(shí)現(xiàn)了一個(gè)通用接口),具體處理方式不清楚。

舉個(gè)例子來(lái)說(shuō)明:

小花:你好,我開(kāi)發(fā)過(guò)很多erp系統(tǒng),是一位經(jīng)驗(yàn)豐富的女司機(jī),現(xiàn)在想找一份java程序員的工作...(成熟穩(wěn)重型)

獵頭:好的,我已經(jīng)把你加入到我的程序員清單里面了,不要打電話給我,我會(huì)通知你的(好萊塢原則)

小明:本人學(xué)識(shí)淵博、經(jīng)驗(yàn)豐富,代碼風(fēng)騷、效率恐怖,c/c++、java、php無(wú)不精通,熟練掌握各種框架,深山苦練20余年,一天只睡4小時(shí),電話通知出bug后秒登vpn,千里之外定位問(wèn)題,瞬息之間修復(fù)上線。 身體強(qiáng)壯、健步如飛,可連續(xù)編程100小時(shí)不休息,討論技術(shù)方案5小時(shí)不喝水,上至帶項(xiàng)目、出方案,下至盜賬號(hào)、威脅pm,什么都能干......(花式裝逼型)

獵頭:666,我已經(jīng)把你加入到我的程序員清單里面了,不要打電話給我,我會(huì)通知你的(小明和小花注冊(cè)為觀察者)

小花和小明繼續(xù)過(guò)著自己的日子,因?yàn)樗麄円呀?jīng)在獵頭的清單里面了,有工作會(huì)收到通知的。

獵頭:小花同學(xué),小明同學(xué),這里需要一個(gè)資深的全棧工程師,創(chuàng)業(yè)型,彈性工作制,股票期權(quán),年終分紅...(通知所有觀察者

小明:好的(隨后憑借著小明的機(jī)智,獲得了這份工作)

獵頭:請(qǐng)把介紹費(fèi)匯到我的銀行卡

又過(guò)了一段日子,小花憑借著自己豐富的經(jīng)驗(yàn),找到了工作,并沒(méi)有依靠獵頭,所以也就沒(méi)有什么介紹費(fèi)

小花:我已經(jīng)找到工作了,請(qǐng)不要再給我發(fā)招聘信息了(移除觀察者)

10年之后...

小花娶妻生子,迎娶白富美,出任CEO,走上人生巔峰,孩子已經(jīng)快要1米高了....(等等,好像有什么地方不對(duì))

小明由于天天加班,1天只睡4個(gè)小時(shí),墳頭草已經(jīng)1米高了...

當(dāng)然這個(gè)是后話

以上就是訂閱和發(fā)布的解釋?zhuān)?dāng)然,我可以實(shí)話告訴你,這個(gè)和我下面要貼的代碼并沒(méi)有什么關(guān)系。

一個(gè)氣象監(jiān)測(cè)應(yīng)用的需求

概述:建立一個(gè)氣象觀測(cè)的應(yīng)用,從氣象站獲取數(shù)據(jù),并實(shí)時(shí)更新三個(gè)布告板:目前狀況,天氣統(tǒng)計(jì),天氣預(yù)報(bào)

目前狀況:溫度,濕度,氣壓

天氣統(tǒng)計(jì):平均溫度,最低溫度,最高溫度

天氣預(yù)報(bào):明天下雨嗎?

以下是具體實(shí)現(xiàn),涉及到的設(shè)計(jì)原則:

1,針對(duì)抽象編程,不針對(duì)實(shí)現(xiàn)編程

2,多用組合少用繼承

3,開(kāi)閉原則,對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉(所有設(shè)計(jì)模式都是圍繞這個(gè)終極目