观察者模式

上传人:M****1 文档编号:460739125 上传时间:2023-03-01 格式:DOCX 页数:15 大小:228.55KB
返回 下载 相关 举报
观察者模式_第1页
第1页 / 共15页
观察者模式_第2页
第2页 / 共15页
观察者模式_第3页
第3页 / 共15页
观察者模式_第4页
第4页 / 共15页
观察者模式_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《观察者模式》由会员分享,可在线阅读,更多相关《观察者模式(15页珍藏版)》请在金锄头文库上搜索。

1、Java观察者模式的浅析简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对 象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些 观察者对象能够自动更新。观察者模式的结构观察者(Observer)模式是对象的行为型模式,又叫做发表-订阅(Publish/Subscribe) 模式、模型-视图(Model/View )模式、源-收听者(Source/Listener)模式或从属者(Depe ndents) 模式。本模式的类图结构如下:图 1 、观察者模式的静态结构可从类图中看清楚。在观察者模式里有如下的角色:.抽象主题(Subje

2、ct)角色:主题角色把所有的观察者对象的引用保存在一个列表里;每 个主题都可以有任何数量的观察者。主题提供一个接口可以加上或撤销观察者对象;主题角色又 叫做抽象被观察者(Observable)角色;interfaceSui)ject+ atiach:void+ ech:void+ n of/iiO b sefves.vci/cf图 2 、抽象主题角色,有时又叫做抽象被观察者角色,可以用一个抽象类或者一个接口实现;在具体的情 况下也不排除使用具体类实现。.抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到通知时更新 自己;interfaceObs&ver+ update

3、.void图 3 、抽象观察者角色,可以用一个抽象类或者一个接口实现;在具体的情况下也不排除使用具体类实现。.具体主题(ConcreteSubject)角色:保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;具体主题角色又叫作具体被观察者角色;SwjtyecfConcreteSubjectobserversVectorVector+ attachvoid+ detach:void+ ncti,Observ,ers:Yoid+ observers Enumeration图 4 、具体主题角色,通常用一个具体子类实现。具体观察者(ConcreteObserver)角色

4、:保存一个指向具体主题对象的引用;和一 个与主题的状态相符的状态。具体观察者角色实现抽象观察者角色所要求的更新自己的接口,以 便使本身的状态与主题的状态自恰。ObserverConcreteObserver+ updat e void图 5 、具体观察者角色,通常用一个具体子类实现。下面给出一个示意性实现的Java代码。首先在这个示意性的实现里,用一个Java接口实 现抽象主题角色,这就是下面的Subject接口:public interface Subjectpublic void attach(Observer observer);public void detach(Observer o

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

6、此向量的元素增减操作。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()Enumer

7、ation enumeration = observers();while (enumeration. hasMoreElements()(Observer)enumeration.nextElement().update(); public Enumeration observers。 return ( (Vector) observersVector.clone().elements(); private Vector observersVector = new java.util.Vector();代码清单2、ConcreteSubject类的源代码。抽象观察者角色的实现实际上是最为简单

8、的一个,它是一个Java接口,只声明了一个方法, 即update。这个方法被子类实现后,一被调用便刷新自己。public interface Observervoid update();代码清单3、Observer接口的源代码。具体观察者角色的实现其实只涉及update。方法的实现。这个方法怎么实现与应用密切相 关,因此本类只给出一个框架。public class ConcreteObserver implements Observer public void update()/ Write your code here 代码清单4、ConcreteObserver类的源代码。虽然观察者模式的

9、实现方法可以有设计师自己确定,但是因为从 AWT1.1开始视窗系统的 事件模型采用观察者模式,因此观察者模式在Java语言里的地位较为重要。正因为这个原因, Java语言给出了它自己对观察者模式的支持。因此,本文建议读者在自己的系统中应用观察者 模式时,不妨利用Java语言所提供的支持。Java语言提供的对观察者模式的支持在Java语言的java.util库里面,提供了一个Observable类以及一个Observer接口, 构成Java语言对观察者模式的支持。Observer 接口这个接口只定义了一个方法,update。当被观察者对象的状态发生变化时,这个方法就 会被调用。这个方法的实现应当

10、调用每一个被观察者对象的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.

11、Observable提供公开的方法 支持观察者对象,这些方法中有两个对Observable的子类非常重要:一个是setChanged(), 另一个是notifyObservers()。第一个方法setChanged()被调用之后会设置一个内部标记变 量,代表被观察者对象的状态发生了变化。第二个是notifyObservers(),这个方法被调用时, 会调用所有登记过的观察者对象的update。方法,使这些观察者对象可以更新自己。java.util.Observable类还有其它的一些重要的方法。比如,观察者对象可以调用 java.util.Observable类的addObserver()方法

12、,将对象一个一个加入到一个列表上。当有变 化时,这个列表可以告诉notifyObservers()方法那些观察者对象需要通知。由于这个列表是 私有的,因此java.util.Observable的子对象并不知道观察者对象一直在观察着它们。javB.util.OtJSErvatJlE-changed:kioolean=false-ohs 质+ObservableO+addObsever(o:Otisever)void +delete Ob server(o: Ob server):void +noti1yObserYe rsQxoid+notifj/Ob serve rs(arg:Objectv

13、oid +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

14、()notifyObservers(null);/*如果本对象有变化(那时hasChanged方法会返回true )*调用本方法通知所有登记在案的观察者,即调用它们的update()方法, *传入this和arg作为参量。*/public void notifyObservers(Object arg)/*临时存放当前的观察者的状态。参见备忘录模式。*/Objec t arrLocal;synchronized (this)if (!changed) return; arrLocal = obs .toArray(); clearChanged();for (int i = arrLocal.

15、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;/*返还被观察对象(即此对象)的观察者总数。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 机械/制造/汽车 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号