电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java設計模式之觀察者模式原理與用法詳解

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

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

什么是觀察者模式

可以這么理解:

觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。

這個主題對象在狀態上發生變化時,會通知所有觀察者對象,讓它們能夠自動更新自己。

也可以這樣理解:

觀察者模式是關于多個對象想知道一個對象中數據變化情況的一種成熟模式。觀察者模式中有一個稱作“主題”的對象和若干個稱作“觀察者”的對象,“主題”和“觀察者”之間是一種一對多的依賴關系。

當“主題”的狀態發生變化時,所有“觀察者”都得到通知。

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

觀察者模式類圖:

Java設計模式之觀察者模式原理與用法詳解

應用場景

一般被用來實現事件處理系統。

觀察者模式組成

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

從類圖看,代碼實現有四個角色:

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

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

具體主題角色:在具體主題內部狀態改變時,給所有登記過的觀察者發出通知。具體主題角色通常用一個子類實現。

具體觀察者角色:該角色實現抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題的狀態相協調。通常用一個子類實現。如果需要,具體觀察者角色可以保存一個指向具體主題角色的引用。

代碼實現觀察者模式 抽象主題角色

主題接口規定了具體主題需要實現的添加,刪除及通知觀察者更新數據的方法

/** * 抽象主題,被觀察者 * */public interface Subject { /** * 添加觀察者 * * @param observer */ void addObserver(Observer observer); /** * 移除指定的觀察者 * * @param observer */ void removeObserver(Observer observer); /** * 移除所有的觀察者 */ void removeAll(); /** * data 是要通知給觀察者的數據 因為Object是所有類的父類,可以使用多態,當然 你也可以使用 泛型 * * @param data */ void notifyAllObserver(Object data); /** * 單獨 通知某一個觀察者 * * @param observer * @param data * data 是要通知給觀察者的數據 因為Object是所有類的父類,可以使用多態,當然 你也可以使用 泛型 */ void notify(Observer observer, Object data); } 抽象觀察者角色

觀察者接口規定了具體觀察者用來更新數據的方法

/** * 抽象觀察者接口 */public interface Observer { /** * * @param subject 被觀察者 * @param data 被觀察者傳遞給觀察者的 數據 */ 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 // 確保相同的觀察者只含有一個 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); } } } 具體的觀察者角色

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

觀察者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()); } } 測試類

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'); //通知某個特定的觀察者OberverTwo concreteSubject.notify(observerTwo, 'Specila msg for you'); //觀察者ObserveThree 決定不再訂閱主題 concreteSubject.removeObserver(observerThree); //通知所有的觀察者 concreteSubject.notifyAllObserver('new Message come '); } }

更多java相關內容感興趣的讀者可查看本站專題:《Java面向對象程序設計入門與進階教程》、《Java數據結構與算法教程》、《Java操作DOM節點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》

希望本文所述對大家java程序設計有所幫助。

標簽: Java
相關文章:
主站蜘蛛池模板: 管家婆-管家婆软件-管家婆辉煌-管家婆进销存-管家婆工贸ERP | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 | 异噻唑啉酮-均三嗪-三丹油-1227-中北杀菌剂厂家 | 北京中创汇安科贸有限公司| 上海logo设计| 路面机械厂家 | 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 减速机电机一体机_带电机减速器一套_德国BOSERL电动机与减速箱生产厂家 | 砂石生产线_石料生产线设备_制砂生产线设备价格_生产厂家-河南中誉鼎力智能装备有限公司 | 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | 合肥白癜风医院_[治疗白癜风]哪家好_合肥北大白癜风医院 | 安全阀_弹簧式安全阀_美标安全阀_工业冷冻安全阀厂家-中国·阿司米阀门有限公司 | 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛婚外情取证-青岛王军侦探事务所 | 广东恩亿梯电源有限公司【官网】_UPS不间断电源|EPS应急电源|模块化机房|电动汽车充电桩_UPS电源厂家(恩亿梯UPS电源,UPS不间断电源,不间断电源UPS) | 防火门-专业生产甲级不锈钢钢质防火门厂家资质齐全-广东恒磊安防设备有限公司 | 锻造液压机,粉末冶金,拉伸,坩埚成型液压机定制生产厂家-山东威力重工官方网站 | 闪蒸干燥机-喷雾干燥机-带式干燥机-桨叶干燥机-[常州佳一干燥设备] | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | 隔爆型防爆端子分线箱_防爆空气开关箱|依客思 | 不锈钢复合板|钛复合板|金属复合板|南钢集团安徽金元素复合材料有限公司-官网 | 肉嫩度仪-凝胶测试仪-国产质构仪-气味分析仪-上海保圣实业发展有限公司|总部 | 北京企业宣传片拍摄_公司宣传片制作-广告短视频制作_北京宣传片拍摄公司 | 卸料器-卸灰阀-卸料阀-瑞安市天蓝环保设备有限公司 | 铣刨料沥青破碎机-沥青再生料设备-RAP热再生混合料破碎筛分设备 -江苏锡宝重工 | 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 蜂蜜瓶-玻璃瓶-玻璃瓶厂-玻璃瓶生产厂家-徐州贵邦玻璃制品有限公司 | 冻干机(冷冻干燥机)_小型|实验型|食品真空冷冻干燥机-松源 | 中药二氧化硫测定仪,食品二氧化硫测定仪|俊腾百科 | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 | 耐破强度测试仪-纸箱破裂强度试验机-济南三泉中石单品站 | 小型气象站_便携式自动气象站_校园气象站-竞道气象设备网 | 玄米影院| 金蝶帐无忧|云代账软件|智能财税软件|会计代账公司专用软件 | 美国查特CHART MVE液氮罐_查特杜瓦瓶_制造全球品质液氮罐 | 石家庄小程序开发_小程序开发公司_APP开发_网站制作-石家庄乘航网络科技有限公司 | CE认证_FCC认证_CCC认证_MFI认证_UN38.3认证-微测检测 CNAS实验室 | 宁夏活性炭_防护活性炭_催化剂载体炭-宁夏恒辉活性炭有限公司 | 钣金加工厂家-钣金加工-佛山钣金厂-月汇好 | 硬齿面减速机_厂家-山东安吉富传动设备股份有限公司 | ★塑料拖链__工程拖链__电缆拖链__钢制拖链 - 【上海闵彬】 | SMN-1/SMN-A ABB抽屉开关柜触头夹紧力检测仪-SMN-B/SMN-C-上海徐吉 |