定義
觀察者模式(Observer Pattern)割笙,又叫發(fā)布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式翠肘、源-監(jiān)聽器(Source/Listener)模式或從屬者(Dependents)模式檐束。定義一種一對(duì)多的依賴關(guān)系,一個(gè)主題對(duì)象可被多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽束倍,使得每當(dāng)主題對(duì)象狀態(tài)變化時(shí)被丧,所有依賴于它的對(duì)象都會(huì)得到通知并被自動(dòng)更新。
屬于行為型模式肌幽。
適用場(chǎng)景
- 當(dāng)一個(gè)抽象模型包含兩個(gè)方面內(nèi)容晚碾,其中一個(gè)方面依賴于另一個(gè)方面
- 其他一個(gè)或多個(gè)對(duì)象的變化依賴于另一個(gè)對(duì)象的變化。
- 實(shí)現(xiàn)類似廣播機(jī)制的功能喂急,無需知道具體收聽者格嘁,只需分發(fā)廣播,系統(tǒng)中感興趣的對(duì)象會(huì)自動(dòng)接收該廣播廊移。
- 多層級(jí)嵌套使用糕簿,形成一種鏈?zhǔn)接|發(fā)機(jī)制探入,使得事件具備跨域(跨越兩種觀察者類型)通知。
舉例
- Spring ContextLoaderListener
- JDK EventListener
優(yōu)點(diǎn)
- 觀察者和被觀察者是松耦合(抽象耦合)的懂诗,符合依賴倒置原則蜂嗽。
- 分離了表示層(觀察者)和數(shù)據(jù)邏輯層(被觀察者),并且建立了一套觸發(fā)機(jī)制殃恒,使得數(shù)據(jù)的變化可以響應(yīng)到多個(gè)表示層上植旧。
- 實(shí)現(xiàn)了一對(duì)多的通訊機(jī)制,支持事件注冊(cè)機(jī)制离唐,支持興趣分發(fā)機(jī)制病附,當(dāng)被觀察者觸發(fā)事件時(shí),只有感興趣的觀察者可以接收到通知亥鬓。
缺點(diǎn)
- 如果觀察者數(shù)量過多完沪,則事件通知會(huì)耗時(shí)較長(zhǎng)。
- 事件通知呈線性關(guān)系嵌戈,如果其中一個(gè)觀察者處理事件卡殼覆积,會(huì)影響后續(xù)的觀察者接收該事件。
- 如果觀察者和被觀察者之間存在循環(huán)依賴熟呛,則可能造成兩者之間的循環(huán)調(diào)用宽档,導(dǎo)致系統(tǒng)崩潰。