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