觀察者模式(Observer)

定義對象之間的一種一對多依賴關(guān)系,使得每當(dāng)一個對象狀態(tài)發(fā)生改變時,其相關(guān)依賴對象皆得到通知并被自動更新号显。觀察者模式的別名包括發(fā)布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式斑胜、源-監(jiān)聽器(Source/Listener)模式或從屬者(Dependents)模式。

類型

行為型

類圖

觀察者模式類圖

參與者

  • Subject(目標(biāo)):目標(biāo)又稱為主題,它是指被觀察的對象。在目標(biāo)中定義了一個觀察者集合硝烂,一個觀察目標(biāo)可以接受任意數(shù)量的觀察者來觀察,它提供一系列方法來增加和刪除觀察者對象铜幽,同時它定義了通知方法notify()。目標(biāo)類可以是接口串稀,也可以是抽象類或具體類除抛。
  • ConcreteSubject(具體目標(biāo)):具體目標(biāo)是目標(biāo)類的子類,通常它包含有經(jīng)常發(fā)生改變的數(shù)據(jù)母截,當(dāng)它的狀態(tài)發(fā)生改變時到忽,向它的各個觀察者發(fā)出通知;同時它還實(shí)現(xiàn)了在目標(biāo)類中定義的抽象業(yè)務(wù)邏輯方法(如果有的話)清寇。如果無須擴(kuò)展目標(biāo)類喘漏,則具體目標(biāo)類可以省略。
  • Observer(觀察者):觀察者將對觀察目標(biāo)的改變做出反應(yīng)华烟,觀察者一般定義為接口翩迈,該接口聲明了更新數(shù)據(jù)的方法update(),因此又稱為抽象觀察者盔夜。
  • ConcreteObserver(具體觀察者):在具體觀察者中維護(hù)一個指向具體目標(biāo)對象的引用负饲,它存儲具體觀察者的有關(guān)狀態(tài),這些狀態(tài)需要和具體目標(biāo)的狀態(tài)保持一致喂链;它實(shí)現(xiàn)了在抽象觀察者Observer中定義的update()方法返十。通常在實(shí)現(xiàn)時,可以調(diào)用具體目標(biāo)類的attach()方法將自己添加到目標(biāo)類的集合中或通過detach()方法將自己從目標(biāo)類的集合中刪除椭微。

用法

代碼助記
  • 目標(biāo)中定義觀察者列表洞坑,并提供attach/detach方法。

總結(jié)

優(yōu)點(diǎn)
  • 觀察者模式可以實(shí)現(xiàn)表示層和數(shù)據(jù)邏輯層的分離蝇率,定義了穩(wěn)定的消息更新傳遞機(jī)制迟杂,并抽象了更新接口刽沾,使得可以有各種各樣不同的表示層充當(dāng)具體觀察者角色。
  • 觀察者模式在觀察目標(biāo)和觀察者之間建立一個抽象的耦合逢慌。觀察目標(biāo)只需要維持一個抽象觀察者的集合悠轩,無須了解其具體觀察者。由于觀察目標(biāo)和觀察者沒有緊密地耦合在一起攻泼,因此它們可以屬于不同的抽象化層次火架。
  • 觀察者模式支持廣播通信,觀察目標(biāo)會向所有已注冊的觀察者對象發(fā)送通知忙菠,簡化了一對多系統(tǒng)設(shè)計(jì)的難度何鸡。
  • 觀察者模式滿足“開閉原則”的要求,增加新的具體觀察者無須修改原有系統(tǒng)代碼牛欢,在具體觀察者與觀察目標(biāo)之間不存在關(guān)聯(lián)關(guān)系的情況下骡男,增加新的觀察目標(biāo)也很方便。
缺點(diǎn)
  • 如果一個觀察目標(biāo)對象有很多直接和間接觀察者傍睹,將所有的觀察者都通知到會花費(fèi)很多時間隔盛。
  • 如果在觀察者和觀察目標(biāo)之間存在循環(huán)依賴,觀察目標(biāo)會觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用拾稳,可能導(dǎo)致系統(tǒng)崩潰吮炕。
  • 觀察者模式?jīng)]有相應(yīng)的機(jī)制讓觀察者知道所觀察的目標(biāo)對象是怎么發(fā)生變化的,而僅僅只是知道觀察目標(biāo)發(fā)生了變化访得。
適用場景
  • 一個抽象模型有兩個方面龙亲,其中一個方面依賴于另一個方面,將這兩個方面封裝在獨(dú)立的對象中使它們可以各自獨(dú)立地改變和復(fù)用悍抑。
  • 一個對象的改變將導(dǎo)致一個或多個其他對象也發(fā)生改變鳄炉,而并不知道具體有多少對象將發(fā)生改變,也不知道這些對象是誰搜骡。
  • 需要在系統(tǒng)中創(chuàng)建一個觸發(fā)鏈拂盯,A對象的行為將影響B(tài)對象,B對象的行為將影響C對象……浆兰,可以使用觀察者模式創(chuàng)建一種鏈?zhǔn)接|發(fā)機(jī)制
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末磕仅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子簸呈,更是在濱河造成了極大的恐慌榕订,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜕便,死亡現(xiàn)場離奇詭異劫恒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門两嘴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丛楚,“玉大人,你說我怎么就攤上這事憔辫∪ば” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵贰您,是天一觀的道長坏平。 經(jīng)常有香客問我,道長锦亦,這世上最難降的妖魔是什么舶替? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮杠园,結(jié)果婚禮上顾瞪,老公的妹妹穿的比我還像新娘。我一直安慰自己抛蚁,他們只是感情好陈醒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瞧甩,像睡著了一般孵延。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亲配,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機(jī)與錄音惶凝,去河邊找鬼吼虎。 笑死,一個胖子當(dāng)著我的面吹牛苍鲜,可吹牛的內(nèi)容都是我干的思灰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼混滔,長吁一口氣:“原來是場噩夢啊……” “哼洒疚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坯屿,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤油湖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后领跛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乏德,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了喊括。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胧瓜。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖郑什,靈堂內(nèi)的尸體忽然破棺而出府喳,到底是詐尸還是另有隱情,我是刑警寧澤蘑拯,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布钝满,位于F島的核電站,受9級特大地震影響强胰,放射性物質(zhì)發(fā)生泄漏舱沧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一偶洋、第九天 我趴在偏房一處隱蔽的房頂上張望熟吏。 院中可真熱鬧,春花似錦玄窝、人聲如沸牵寺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帽氓。三九已至,卻和暖如春俩块,著一層夾襖步出監(jiān)牢的瞬間黎休,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工玉凯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留势腮,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓漫仆,卻偏偏與公主長得像捎拯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子盲厌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容