摘要:觀察者模式,是一對多的關系,一個主題對應多個觀察者,當這個主題發生變化的時候,所有觀察著這個主題的觀察者都會接收到通知來獲悉主題的變化。這就是使用的觀察者模式,下面就讓我們用代碼實現觀察者模式。
觀察者模式,是一對多的關系,一個主題對應多個觀察者,當這個主題發生變化的時候,所有觀察著這個主題的觀察者都會接收到通知來獲悉主題的變化。
在現實中我們也會遇到許許多多應用觀察者模式的行為,比如電視的節目頻道里有時候會有暴雨天氣的標志,這個標志是會隨著天氣的變化來顯示,而我們顯示的也是最新的天氣標志,在這里電視頻道就相當于是一個主題,而我們的電視機就是這個主題觀察者,所以當這個天氣標志有變化時電視上的畫面也隨著變化。這就是使用的觀察者模式,下面就讓我們用代碼實現觀察者模式。
首先我們需要定義主題的接口,這里面有三個方法,registerObserver、removeObserver和notifyObserver,分別是用來添加觀察者、去除觀察者和通知所有觀察者。其中dataChange方法是只要當數據有變化就會被調用,我們需要在這個方法里調用notifyObserver去通知所有的觀察者數據變化的內容,這里我們使用setSimulateDataChange方法來模擬數據的變化。
public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObserver(); }
然后我們創建一個具體的主題類來實現這個主題接口,假設這個類是獲取電視頻道的信息。在這個類里面我們需要創建一個集合用來存取觀察這個主題的所有觀察者,接口中的registerObserver和removeObserver方法實際就是對集合的增刪操作,而notifyObserver方法其實就是遍歷集合通知所有的對象。
public class TelevisionData implements Subject { private String showName; private String showType; private ArrayListlist; public TelevisionData(){ list = new ArrayList (); } @Override public void registerObserver(Observer observer) { list.add(observer); } @Override public void removeObserver(Observer observer) { int index = list.indexOf(observer); if (index>=0){ list.remove(index); } } @Override public void notifyObserver() { ListIterator listIterator = list.listIterator(); while (listIterator.hasNext()){ Observer observer = (Observer)listIterator.next(); observer.update(showName,showType); } } public void dataChange(){ notifyObserver(); } //此方法用于模擬控制數據的更新,數據更新后會調用dataChange方法 public void setSimulateDataChange(String showName,String showType){ this.showName = showName; this.showType= showType; dataChange(); } }
主題部分的代碼寫好了,接著我們需要寫觀察者的代碼,電視節目都播放在電視上,那我們把創建的電視類抽取出一個show方法放在Display接口中。
public interface Display { void show(); }
另外觀察者還有一個共性,就是要接收更新到的數據進行更新,所以我們再抽取出一個update方法放到Obeserver接口中。
public interface Observer { void update(String showName,String showNum); }
最后我們創建觀察者的類來實現這兩個接口,在這個類中showName和showType字段是用來接收主題的數據的,而subject則是要關注的主題類型引用,通過這個引用我們就可以調用registerObserver和removeObserver來控制觀察者是否還要觀察這個主題。當主題更新時則會調用update方法,觀察者獲取到更新的數據就再調用show方法顯示出來。
public class John implements Observer,Display { private Subject subject; private String showName; private String showType; public John(Subject subject){ this.subject = subject; } @Override public void show() { System.out.println("john收看的當前天氣類型-" + showType); System.out.println("john收看的當前天氣級別-" + showName); } @Override public void update(String showName,String showType) { this.showName = showName; this.showType = showType; show(); } public void registerObserver(){ this.subject.registerObserver(this); } public void removeObserver(){ this.subject.removeObserver(this); } } public class Jack implements Observer,Display { private Subject subject; private String showName; private String showType; public Jack(Subject subject){ this.subject = subject; } @Override public void show() { System.out.println("jack收看的當前天氣類型-" + showType); System.out.println("jack收看的當前天氣級別-" + showName); } @Override public void update(String showName,String showType) { this.showName = showName; this.showType = showType; show(); } public void registerObserver(){ this.subject.registerObserver(this); } public void removeObserver(){ this.subject.removeObserver(this); } }
下面我們來測試一下
//創建一個主題 televisionData = new TelevisionData(); //添加觀察者 John john = new John(televisionData); john.registerObserver(); Jack jack = new Jack(televisionData); jack.registerObserver(); //模擬數據更新 changeData("大風", "5級"); changeData("暴雨", "紅色"); public static void changeData(String showName, String showType) { televisionData.setSimulateDataChange(showName,showType); }
結果:
john收看的當前天氣類型-紅色
john收看的當前天氣級別-暴雨
jack收看的當前天氣類型-紅色
jack收看的當前天氣級別-暴雨
john收看的當前天氣類型-5級
john收看的當前天氣級別-大風
jack收看的當前天氣類型-5級
jack收看的當前天氣級別-大風
我們再試著去掉一個觀察者看它還會不會收到更新,結果是不會收到更新了
changeData("暴雨", "紅色"); john.removeObserver(); changeData("大風", "5級");
結果:
john收看的當前天氣類型-紅色
john收看的當前天氣級別-暴雨
jack收看的當前天氣類型-紅色
jack收看的當前天氣級別-暴雨
jack收看的當前天氣類型-5級
jack收看的當前天氣級別-大風
總結:
觀察者模式的大致原理其實就是觀察者持有主題的引用來控制主題內部的集合對自己增刪從而控制是否關注這個主題,而主題則通過對集合中的對象的操作,把數據的更新通知給所有的觀察者。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69059.html
摘要:哪吒社區技能樹打卡打卡貼函數式接口簡介領域優質創作者哪吒公眾號作者架構師奮斗者掃描主頁左側二維碼,加入群聊,一起學習一起進步歡迎點贊收藏留言前情提要無意間聽到領導們的談話,現在公司的現狀是碼農太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區Java技能樹打卡?【打卡貼 day2...
摘要:觀察者模式面向的需求是對象觀察者對對象被觀察者的某種變化高度敏感,需要在變化的一瞬間做出反應。規定,當不會再有新的發出時,需要觸發方法作為標志。在事件處理過程中出異常時,會被觸發,同時隊列自動終止,不允許再有事件發出。 我從去年開始使用 RxJava ,到現在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的 Android 項目也在使用 RxJava ,并且使...
摘要:時間年月日星期二說明本文部分內容均來自慕課網。慕課網教學源碼學習源碼第一章觀察者模式概述課程簡介觀察者模式的定義定義對象間的一種一對多的依賴關系。 時間:2017年08月29日星期二說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.com/z...
閱讀 1829·2021-11-11 16:55
閱讀 749·2019-08-30 15:53
閱讀 3587·2019-08-30 15:45
閱讀 670·2019-08-30 14:10
閱讀 3262·2019-08-30 12:46
閱讀 2122·2019-08-29 13:15
閱讀 2025·2019-08-26 13:48
閱讀 933·2019-08-26 12:23