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