电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

观察者模式

15页
  • 卖家[上传人]:M****1
  • 文档编号:460739125
  • 上传时间:2023-03-01
  • 文档格式:DOCX
  • 文档大小:228.55KB
  • / 15 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、Java观察者模式的浅析简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对 象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些 观察者对象能够自动更新。观察者模式的结构观察者(Observer)模式是对象的行为型模式,又叫做发表-订阅(Publish/Subscribe) 模式、模型-视图(Model/View )模式、源-收听者(Source/Listener)模式或从属者(Depe ndents) 模式。本模式的类图结构如下:图 1 、观察者模式的静态结构可从类图中看清楚。在观察者模式里有如下的角色:.抽象主题(Subject)角色:主题角色把所有的观察者对象的引用保存在一个列表里;每 个主题都可以有任何数量的观察者。主题提供一个接口可以加上或撤销观察者对象;主题角色又 叫做抽象被观察者(Observable)角色;interfaceSui)ject+ atiach:void+ ech:void+ n of/iiO b sefves.vci/cf图 2 、抽象主题角色,有时又叫做抽象被观察者角色,可以用一个抽象类或

      2、者一个接口实现;在具体的情 况下也不排除使用具体类实现。.抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到通知时更新 自己;interfaceObs&ver+ update .void图 3 、抽象观察者角色,可以用一个抽象类或者一个接口实现;在具体的情况下也不排除使用具体类实现。.具体主题(ConcreteSubject)角色:保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;具体主题角色又叫作具体被观察者角色;SwjtyecfConcreteSubjectobserversVectorVector+ attachvoid+ detach:void+ ncti,Observ,ers:Yoid+ observers Enumeration图 4 、具体主题角色,通常用一个具体子类实现。具体观察者(ConcreteObserver)角色:保存一个指向具体主题对象的引用;和一 个与主题的状态相符的状态。具体观察者角色实现抽象观察者角色所要求的更新自己的接口,以 便使本身的状态与主题的状态自恰。ObserverConcreteObser

      3、ver+ updat e void图 5 、具体观察者角色,通常用一个具体子类实现。下面给出一个示意性实现的Java代码。首先在这个示意性的实现里,用一个Java接口实 现抽象主题角色,这就是下面的Subject接口:public interface Subjectpublic void attach(Observer observer);public void detach(Observer observer);void notifyObservers();代码清单1、Subject接口的源代码。这个抽象主题接口规定出三个子类必须实现的操作,即attach。用来增加一个观察者对 象;detach()用来删除一个观察者对象;和notifyObservers()用来通知各个观察者刷新它 们自己。抽象主题角色实际上要求子类保持一个以所有的观察者对象为元素的列表。具体主题则是实现了抽象主题Subject接口的一个具体类,它给出了以上的三个操作的具 体实现。从下面的源代码可以看出,这里给出的Java实现使用了一个Java向量来保存所有的 观察者对象,而attach。和detach()操作则是对

      4、此向量的元素增减操作。import java .util.Vector;import java.util. Enumeration;public class ConcreteSubject implements Subjectpublic void attach(Observer observer)observersVector .addElement(observer);public void detach(Observer observer)observersVector.removeElement(observer);public void notifyObservers()Enumeration enumeration = observers();while (enumeration. hasMoreElements()(Observer)enumeration.nextElement().update(); public Enumeration observers。 return ( (Vector) observersVector.clone().elements(); p

      5、rivate Vector observersVector = new java.util.Vector();代码清单2、ConcreteSubject类的源代码。抽象观察者角色的实现实际上是最为简单的一个,它是一个Java接口,只声明了一个方法, 即update。这个方法被子类实现后,一被调用便刷新自己。public interface Observervoid update();代码清单3、Observer接口的源代码。具体观察者角色的实现其实只涉及update。方法的实现。这个方法怎么实现与应用密切相 关,因此本类只给出一个框架。public class ConcreteObserver implements Observer public void update()/ Write your code here 代码清单4、ConcreteObserver类的源代码。虽然观察者模式的实现方法可以有设计师自己确定,但是因为从 AWT1.1开始视窗系统的 事件模型采用观察者模式,因此观察者模式在Java语言里的地位较为重要。正因为这个原因, Java语言给出了它自己对观察者模式的支持

      6、。因此,本文建议读者在自己的系统中应用观察者 模式时,不妨利用Java语言所提供的支持。Java语言提供的对观察者模式的支持在Java语言的java.util库里面,提供了一个Observable类以及一个Observer接口, 构成Java语言对观察者模式的支持。Observer 接口这个接口只定义了一个方法,update。当被观察者对象的状态发生变化时,这个方法就 会被调用。这个方法的实现应当调用每一个被观察者对象的notifyObservers()方法,从而通 知所有的观察对象。interfacejava.utii. Observer图 6 、 java.util 提供的 Observer 接口的类图。package java.util;public interface Observer/*当被观察的对象发生变化时,这个方法会被调用。*/void update(Observable o, Object arg);代码清单5、java.util.Observer接口的源代码。Observable 类被观察者类都是java.util.Observable类的子类。java.util.

      7、Observable提供公开的方法 支持观察者对象,这些方法中有两个对Observable的子类非常重要:一个是setChanged(), 另一个是notifyObservers()。第一个方法setChanged()被调用之后会设置一个内部标记变 量,代表被观察者对象的状态发生了变化。第二个是notifyObservers(),这个方法被调用时, 会调用所有登记过的观察者对象的update。方法,使这些观察者对象可以更新自己。java.util.Observable类还有其它的一些重要的方法。比如,观察者对象可以调用 java.util.Observable类的addObserver()方法,将对象一个一个加入到一个列表上。当有变 化时,这个列表可以告诉notifyObservers()方法那些观察者对象需要通知。由于这个列表是 私有的,因此java.util.Observable的子对象并不知道观察者对象一直在观察着它们。javB.util.OtJSErvatJlE-changed:kioolean=false-ohs 质+ObservableO+addObsever(o:Otis

      8、ever)void +delete Ob server(o: Ob server):void +noti1yObserYe rsQxoid+notifj/Ob serve rs(arg:Objectvoid +deleteObserYers0oid setChangedOoid #clearChangedQ:void +hasChang 已 dO:tiool 已日 n +couritObseiversQ:irit图7、Java语言提供的被观察者的类图。被观察者类Observable的源代码:*将一个观察者对象从观察者列表上删除。*/public synchronized void deleteObserver(Observer o)obs.removeEleme nt(o);/* 相当于 notifyObservers(null) */public void notifyObservers()notifyObservers(null);/*如果本对象有变化(那时hasChanged方法会返回true )*调用本方法通知所有登记在案的观察者,即调用它们的update()方法, *传入th

      9、is和arg作为参量。*/public void notifyObservers(Object arg)/*临时存放当前的观察者的状态。参见备忘录模式。*/Objec t arrLocal;synchronized (this)if (!changed) return; arrLocal = obs .toArray(); clearChanged();for (int i = arrLocal.leng th-1; i=0; i-) (Observer)arrLocali).update( this, arg); /*将观察者列表清空*/public synchronized void deleteObservers()obs.removeAllEleme nt s();*将“已变化”设为trueprotected synchronized void setChanged()changed = true ;/*将“已变化”重置为falseclearChanged()protected synchronized voidchanged = false ;/*探测本对象是否已变化public synchronized boolean hasChanged() return changed;/*返还被观察对象(即此对象)的观察者总数。

      《观察者模式》由会员M****1分享,可在线阅读,更多相关《观察者模式》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.