設(shè)計模式目前分為23種三大類,而觀察者模式作為開發(fā)設(shè)計中常用的代碼設(shè)計模式之一,屬于行為模式中的一種,也是我們眾多開發(fā)最容易掌握應(yīng)用的一種,今天我們來聊一聊觀察者模式。
觀察者模式的定義
觀察者模式(Observer Design Pattern):在對象之間定義一個一對多的依賴,當(dāng)一個對象狀態(tài)改變的時候,所有依賴的對象都會得到通知并自動更新。簡單點(diǎn)來說就是當(dāng)某個對象發(fā)生改變時,這個對象的所有觀察者都會做出相應(yīng)的改變。
舉個例子,當(dāng)你干項目時,一旦你的進(jìn)度發(fā)生改變,盯著這項目的領(lǐng)導(dǎo)們,會根據(jù)項目的進(jìn)度做出不同的計劃策略。當(dāng)進(jìn)度慢時,產(chǎn)品催著你加班趕進(jìn)度,市場做好規(guī)劃預(yù)宣傳,人事繼續(xù)招人……
Subject(被觀察者)
定義被觀察者必須實(shí)現(xiàn)的職責(zé), 它可以動態(tài)地增加、 刪除觀察者。它的兩大主要作用是:管理觀察者并通知觀察者。
Observer(觀察者)
觀察者接收到變更消息后,就會進(jìn)行對應(yīng)的方法操作,對接收到的信息進(jìn)行處理。
ConcreteSubject(被觀察者的實(shí)現(xiàn)類)
定義被觀察者自己的業(yè)務(wù)邏輯, 同時定義對哪些事件進(jìn)行通知。
ConcreteObserver(觀察者具體實(shí)現(xiàn))
每個觀察者在接收到消息后的處理反應(yīng)是不同,各個觀察者有自己的處理邏輯。
Code Time
接下來我們用代碼簡單實(shí)現(xiàn)一下圖一的中觀察者模式,首先我們創(chuàng)建一個被觀察者父類Subject,里面包括觀察者的添加移除以及觸發(fā)變化事件;
然后創(chuàng)建一個觀察者的的父類接口Observer,里面包含被觀察者發(fā)生變化時,觀察者需做出對應(yīng)變化的事件;
接下來,定義一個Me繼承自Subject的被察者類,里面有做項目doProject和一個判斷方法,當(dāng)出現(xiàn)delay時,就通知項目的其他人項目延期了,要做出對應(yīng)的措施了;
這里我就簡單舉例寫HRPMOM三個類型的觀察者了,如果需要其他觀察者類型,再實(shí)現(xiàn)Observer接口即可。
最后,我們來測試一下代碼,先創(chuàng)建一個張三的被觀察者類,然后分別創(chuàng)建HR、PM、OM的觀察者,加入觀察張三的隊列,最后在被觀察者張三執(zhí)行邏輯時,觸發(fā)監(jiān)聽改變的事件,所有加入觀察張三的觀察者觸發(fā)自己相應(yīng)的邏輯。
運(yùn)行上述代碼的結(jié)果是:
干活的張三因為項目延期了,其他觀察張三的觀察者果然都做出了自己的處理,HR招人,PM催加班,市場重新規(guī)劃……
觀察者模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
缺點(diǎn)
應(yīng)用場景
總結(jié)
觀察者模式是一種比較容易理解的代碼設(shè)計模式之一,在很多框架中都運(yùn)用到它,比如Spring、Tomcat、MQ設(shè)計中都有大量使用。雖然理解簡單,但用得好卻也不容易,比如需要考慮使用異步通知提高性能時通知可靠性等因素。