日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java設(shè)計(jì)模式之觀察者模式原理與用法詳解

瀏覽:135日期:2022-08-31 17:11:40

本文實(shí)例講述了Java設(shè)計(jì)模式之觀察者模式原理與用法。分享給大家供大家參考,具體如下:

什么是觀察者模式

可以這么理解:

觀察者模式定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象。

這個(gè)主題對(duì)象在狀態(tài)上發(fā)生變化時(shí),會(huì)通知所有觀察者對(duì)象,讓它們能夠自動(dòng)更新自己。

也可以這樣理解:

觀察者模式是關(guān)于多個(gè)對(duì)象想知道一個(gè)對(duì)象中數(shù)據(jù)變化情況的一種成熟模式。觀察者模式中有一個(gè)稱作“主題”的對(duì)象和若干個(gè)稱作“觀察者”的對(duì)象,“主題”和“觀察者”之間是一種一對(duì)多的依賴關(guān)系。

當(dāng)“主題”的狀態(tài)發(fā)生變化時(shí),所有“觀察者”都得到通知。

日常生活中,最容易理解的例子就是微信公眾號(hào)。我們用微信訂閱的微信公共號(hào)就是這里所說的主題,而我們 每一個(gè)關(guān)注這個(gè)微信號(hào)的人就是這里的觀察者。公眾號(hào)每天有更新,所有訂閱者都會(huì)收到。

觀察者模式類圖:

Java設(shè)計(jì)模式之觀察者模式原理與用法詳解

應(yīng)用場(chǎng)景

一般被用來實(shí)現(xiàn)事件處理系統(tǒng)。

觀察者模式組成

從定義看,可以分成兩個(gè)角色, 觀察者和被觀察對(duì)象(即主題)

從類圖看,代碼實(shí)現(xiàn)有四個(gè)角色:

抽象主題角色: 把所有對(duì)觀察者對(duì)象的引用保存在一個(gè)集合中,每個(gè)抽象主題角色都可以有任意數(shù)量的觀察者。抽象主題提供一個(gè)接口,可以增加和刪除觀察者角色。一般用一個(gè)抽象類和接口來實(shí)現(xiàn)。

抽象觀察者角色:為所有具體的觀察者定義一個(gè)接口,在得到主題的通知時(shí)更新自己。

具體主題角色:在具體主題內(nèi)部狀態(tài)改變時(shí),給所有登記過的觀察者發(fā)出通知。具體主題角色通常用一個(gè)子類實(shí)現(xiàn)。

具體觀察者角色:該角色實(shí)現(xiàn)抽象觀察者角色所要求的更新接口,以便使本身的狀態(tài)與主題的狀態(tài)相協(xié)調(diào)。通常用一個(gè)子類實(shí)現(xiàn)。如果需要,具體觀察者角色可以保存一個(gè)指向具體主題角色的引用。

代碼實(shí)現(xiàn)觀察者模式 抽象主題角色

主題接口規(guī)定了具體主題需要實(shí)現(xiàn)的添加,刪除及通知觀察者更新數(shù)據(jù)的方法

/** * 抽象主題,被觀察者 * */public interface Subject { /** * 添加觀察者 * * @param observer */ void addObserver(Observer observer); /** * 移除指定的觀察者 * * @param observer */ void removeObserver(Observer observer); /** * 移除所有的觀察者 */ void removeAll(); /** * data 是要通知給觀察者的數(shù)據(jù) 因?yàn)镺bject是所有類的父類,可以使用多態(tài),當(dāng)然 你也可以使用 泛型 * * @param data */ void notifyAllObserver(Object data); /** * 單獨(dú) 通知某一個(gè)觀察者 * * @param observer * @param data * data 是要通知給觀察者的數(shù)據(jù) 因?yàn)镺bject是所有類的父類,可以使用多態(tài),當(dāng)然 你也可以使用 泛型 */ void notify(Observer observer, Object data); } 抽象觀察者角色

觀察者接口規(guī)定了具體觀察者用來更新數(shù)據(jù)的方法

/** * 抽象觀察者接口 */public interface Observer { /** * * @param subject 被觀察者 * @param data 被觀察者傳遞給觀察者的 數(shù)據(jù) */ void update(Subject subject,Object data);} 具體主題角色

public class ConcreteSubject implements Subject { //觀察者集合,用于管理所有的觀察者 List<Observer> mList = new ArrayList<>(); @Override public void addObserver(Observer observer) { // TODO Auto-generated method stub // 確保相同的觀察者只含有一個(gè) if (observer == null) { throw new NullPointerException('observer == null'); } if (!mList.contains(observer)) { mList.add(observer); } } @Override public void removeObserver(Observer observer) { // TODO Auto-generated method stub mList.remove(observer); } @Override public void removeAll() { // TODO Auto-generated method stub mList.clear(); } @Override public void notifyAllObserver(Object data) { // TODO Auto-generated method stub for (Observer observer : mList) { observer.update(this, data); } } @Override public void notify(Observer observer, Object data) { // TODO Auto-generated method stub if (observer != null) { observer.update(this, data); } } } 具體的觀察者角色

這里我們可以定義多個(gè)具體的觀察者角色

觀察者One

public class ObserverOne implements Observer { @Override public void update(Subject subject, Object data) { // TODO Auto-generated method stub System.err .println('the messge from subject to-->' + this.getClass().getName() + '<---is ' + data.toString()); } }

觀察者Two

public class ObserverTwo implements Observer { @Override public void update(Subject subject, Object data) { // TODO Auto-generated method stub System.err .println('the messge from subject to-->' + this.getClass().getName() + '<---is ' + data.toString()); } }

觀察者Three

public class ObserverThree implements Observer { @Override public void update(Subject subject, Object data) { // TODO Auto-generated method stub System.err .println('the messge from subject to-->' + this.getClass().getName() + '<---is ' + data.toString()); } } 測(cè)試類

public class TestObservePattern { public static void main(String[] args) { // TODO Auto-generated method stub ConcreteSubject concreteSubject = new ConcreteSubject(); ObserverOne observerOne=new ObserverOne(); ObserverTwo observerTwo=new ObserverTwo(); ObserverThree observerThree=new ObserverThree(); concreteSubject.addObserver(observerOne); concreteSubject.addObserver(observerTwo); concreteSubject.addObserver(observerThree); //通知所有的觀察者 concreteSubject.notifyAllObserver('wake up,wake up'); //通知某個(gè)特定的觀察者OberverTwo concreteSubject.notify(observerTwo, 'Specila msg for you'); //觀察者ObserveThree 決定不再訂閱主題 concreteSubject.removeObserver(observerThree); //通知所有的觀察者 concreteSubject.notifyAllObserver('new Message come '); } }

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
另类亚洲自拍| 日韩精品不卡一区二区| 欧美aa在线观看| 成人国产综合| 日韩欧美精品一区| 日韩网站中文字幕| 国产一区欧美| 手机精品视频在线观看| 国产女优一区| 亚洲精品中文字幕99999| 亚洲精品日本| 911精品国产| 欧美激情综合| 美女网站视频一区| 亚洲黄色影院| 日韩精品亚洲专区在线观看| 欧美日韩国产在线一区| 欧美日韩日本国产亚洲在线| 国产在线|日韩| 尤物精品在线| 综合激情在线| 国产精品美女午夜爽爽| 欧美激情麻豆| 欧美精品日日操| 99国产精品私拍| 日本国产欧美| 色一区二区三区四区| av亚洲一区二区三区| 色88888久久久久久影院| 久久一区二区三区电影| 悠悠资源网久久精品| 欧美精品自拍| 日韩精品视频网站| 黄色网一区二区| 宅男在线一区| 日韩黄色在线观看| 久久99国产精品视频| 水蜜桃久久夜色精品一区| 五月天av在线| 喷白浆一区二区| 国产精品乱战久久久| 福利欧美精品在线| 欧美精品一二| 日韩精品视频中文字幕| 久久免费精品| 国产精品日韩| 国产精品久久久网站| 91亚洲一区| 男女精品网站| 欧美1区二区| 亚洲精品小说| 国产精成人品2018| 日韩午夜一区| 久久久精品国产**网站| 亚洲www免费| 日本在线成人| 久久精品青草| 国产亚洲久久| 亚洲国产日韩欧美在线| 日韩av三区| 亚洲国产影院| 国产欧美日韩一级| 在线日韩电影| 欧美激情 亚洲a∨综合| 免费久久精品| 精品欧美日韩精品| 黑丝一区二区三区| 捆绑调教美女网站视频一区| 久久久国产精品一区二区中文| 午夜在线一区二区| 日韩电影免费网址| 欧美日韩1区| 在线一区免费观看| 日韩精品诱惑一区?区三区| 三级欧美在线一区| 91一区二区| 日韩欧美三区| 极品裸体白嫩激情啪啪国产精品| 久久激情五月婷婷| 99成人在线| 中文av在线全新| 国产精品巨作av| 亚洲精品福利| 亚洲免费影视| 国产精品99一区二区| 麻豆精品一区二区综合av| 亚洲欧美日韩国产综合精品二区 | 免费在线成人| 亚洲精品亚洲人成在线观看| 精品久久美女| 久久精品97| 亚洲一区二区免费在线观看| 精品中文在线| 日本久久一区| 伊人久久大香伊蕉在人线观看热v| 韩国久久久久久| 久久gogo国模啪啪裸体| 免费日韩av片| 午夜欧美视频| 99久久九九| 日韩av免费| 88xx成人免费观看视频库| 日韩av在线免费观看不卡| 婷婷综合在线| 久久激情网站| 天堂中文在线播放| 国产69精品久久| 国产一区二区三区不卡av| 欧美亚洲一区二区三区| 亚洲免费在线| 亚洲色诱最新| 亚洲欧美不卡| 在线综合亚洲| 亚洲在线电影| 午夜在线精品偷拍| 亚洲一区二区三区四区五区午夜 | 尤物在线精品| 欧美福利一区| 亚洲经典在线| 在线综合视频| 石原莉奈在线亚洲二区| 蜜桃成人av| 激情久久中文字幕| 免费国产自久久久久三四区久久| 精品国产精品久久一区免费式| 日韩高清国产一区在线| 中文无码日韩欧| 综合一区av| 日韩不卡一区二区| 国产亚洲欧美日韩精品一区二区三区 | 青青青免费在线视频| 麻豆一区在线| 麻豆精品视频在线观看| 国产精品一区二区三区四区在线观看| 日本一区二区三区中文字幕| 午夜欧美精品| 久久亚洲国产精品一区二区| 999国产精品| 亚洲高清二区| 久久性天堂网| 青青草91视频| 精品免费av| 日韩精品一卡| 亚洲欧美日韩国产一区二区| 亚洲精品中文字幕乱码| 夜久久久久久| 日本精品在线播放| 久久伊人亚洲| 99久久激情| 久久亚洲影院| 久久国产精品免费一区二区三区| 国产精品久久久久77777丨| 国产精品.xx视频.xxtv| 国产精品国码视频| 国产成人1区| japanese国产精品| 日韩欧美三区| 成人在线视频免费| 亚洲欧美伊人| 人人精品久久| 国产资源在线观看入口av| 日韩中文影院| 亚洲一区二区三区久久久| 日本在线成人| 国产精品久久久久久模特| 精品视频网站| 五月婷婷六月综合| 日本中文字幕不卡| а√天堂8资源在线| 91精品观看| 日本不卡视频一二三区| 久久免费视频66| 亚洲福利久久| 欧美日韩黄网站| 亚洲精品在线影院| 亚洲人成在线影院| 久久久久久婷| 久久亚洲一区| 精品免费av| 99亚洲视频| 你懂的亚洲视频| 精品1区2区3区4区| 国产精品久久| 一区久久精品| 风间由美中文字幕在线看视频国产欧美| 性欧美69xoxoxoxo| 麻豆极品一区二区三区| 欧美~级网站不卡| 国产精区一区二区| 欧美精品自拍| 国产一区二区三区日韩精品| 亚洲精品一区三区三区在线观看| 久久亚洲欧美| 色婷婷色综合| 亚洲精品乱码久久久久久蜜桃麻豆| 麻豆精品少妇| 久久午夜影视| 91精品国产福利在线观看麻豆| 日韩久久99| 国产精品88久久久久久|