
觀察者下篇
在上一篇文章中,我們通過污污彈公司司小司做氣象站項目學習了觀察者模式怎么使用。在本篇中,我們對觀察者模式進行總結及關鍵點,還有一個就是Java中內置的觀察者模式。
本文出處:凱哥Java(kagejava)
一:Java內置的觀察者
我們將使用Java內置的觀察者將氣象站項目重新寫一次。
內置觀察者的區別:
Subject對象:
1:subject名稱變了,變成了Observable了;功能不變,還是注冊、移除、通知觀察者三個功能;
2:observable是對象而非接口了,所以在使用的時候,不能在使用實現了,需要使用繼承關系。好處就是:因為是繼承關系,所以在注冊觀察者、移除觀察者、通知觀察者這三個方法具體實現我們可以不用寫了。
Observer對象:
observer對象名字沒有變化,功能還是update,沒有變化。?而且還是接口對象。
那么為什么observer不用類而用接口呢?因為我們知道,我們的observer是不同的項目,需求不一定的。所以,只能使用接口來定義了。具體實現,各個項目根據自己項目功能自行實現即可。
不同:update時候,可以選擇將信息主動推送給觀察者還是讓觀察者自己來拉去。在Java內置的觀察者模式中,推/拉都可以。
使用Java內置觀察者實現的代碼:
項目結構:

測試類:JavaObserverWeatherMainTest
需要說明的:
public class?CurrentConditionJava?implements?Observer {}
實現的Observer對象所在位置:import?java.util.Observer;
public class?WeaterDataJava?extends?Observable {}
繼承的Observerable對象所在位置:import?java.util.Observable;
運行結果:

達到我們預期的效果。說明,使用Java內置的觀察者模式成功!
使用Java內置的觀察者需要唯一注意的地方:observerable的繼承者在datachange時候,需要先setChanged()。如下圖:

這一點一定要注意。
二:觀察者模式總結及關鍵點
百科上對觀察者模式基本介紹:

實現方式:

觀察者模式使用場景:

觀察者模式四個角色:

抽象主題角色(subject)、主題角色具體實現類
抽象觀察者角色(observer)、觀察者具體實現類
觀察者模式的優缺點:

觀察者模式執行過程

從觀察者模式中體會,松耦合、高內聚、隔離影響的意義:
松耦合:類與類之間不要太依賴,沒有順序。依賴類不用關系被依賴類的內部是怎么實現的。
對應天氣站項目:實現了subject接口的天氣對象不需要關系具體的公告板內部怎么實現的,需要做哪些。subject子類之關心公告板是否實現了observer接口類即可。
聯系凱哥:
公眾號:凱哥Java(kaigejava)
凱哥個人博客:www.kaigejava.com
留個言,加個好友,一起學習
就算實現了observer的公告板對象項目死掉了,subject對象依然可以正常運行。反之,就算subject項目死掉了,依然不會影響observer項目的運行。無非就是公告板不能公布最新數據而已。這就很好的體現了松耦合的好處。
高內聚:對象內部是高內聚的。這樣便于調試、擴展等。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。