如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
用友开发者社区标题:设计模式——OBSERVER(观察者)[打印本页]作者:龟龟时间:2014-4-2414:34标题:设计模式——OBSERVER(观察者)观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。一、观察者模式的结构本模式的类图结构如下:图1、观察者模式的静态结构可从类图中看清楚。在观察者模式里有如下的角色:.抽象主题(Subject)角色:主题角色把所有的观察者对象的引用保存在一个列表里;每个主题都可以有任何数量的观察者。主题提供一个接口可以加上或撤销观察者对象;图2、抽象主题角色,有时又叫做抽象被观察者角色,可以用一个抽象类或者一个接口实现;在具体的情况下也不排除使用具体类实现。.抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到通知时更新自己;图3、抽象观察者角色,可以用一个抽象类或者一个接口实现;在具体的情况下也不排除使用具体类实现。.具体主题(ConcreteSubject)角色:保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;图4、具体主题角色,通常用一个具体子类实现。.具体观察者(ConcreteObserver)角色:保存一个指向具体主题对象的引用;和一个与主题的状态相符的状态。具体观察者角色实现抽象观察者角色所要求的更新自己的接口,以便使本身的状态与主题的状态自恰。图5、具体观察者角色,通常用一个具体子类实现。二、示意性实现的Java代码首先在这个示意性的实现里,用一个Java接口实现抽象主题角色,这就是下面的Subject接口:publicinterfaceSubject{publicvoidattach(Observerobserver);publicvoiddetach(Observerobserver);voidnotifyObservers();}代码清单1、Subject接口的源代码。这个抽象主题接口规定出三个子类必须实现的操作,即attach()用来增加一个观察者对象;detach()用来删除一个观察者对象;和notifyObservers()用来通知各个观察者刷新它们自己。抽象主题角色实际上要求子类保持一个以所有的观察者对象为元素的列表。具体主题则是实现了抽象主题Subject接口的一个具体类。importjava.util.Vector;importjava.util.Enumeration;publicclassConcreteSubjectimplementsSubject{privateVectorobserversVector=newjava.util.Vector();publicvoidattach(Observerobserver){//添加观察者observersVector.addElement(observer);}publicvoiddetach(Observerobserver){//删除该观察者observersVector.removeElement(observer);}publicvoidnotifyObservers(){//遍历观察者向量,通知每个观察者Enumerationenumeration=observers();while(enumeration.hasMoreElements()){((Observer)enumeration.nextElement()).update();}}publicEnumerationobservers(){return((Vector)observersVector.clone()).elements();}}代码清单2、ConcreteSubject类的源代码。抽象观察者角色的实现实际上是最为简单的一个,它是一个Java接口,只声明了一个方法,即update()。这个方法被子类实现后,一被调用便刷新自己。publicinterfaceObserver{voidupdate();}代码清单3、Observer接口的源代码。具体观察者角色的实现其实只涉及update()方法的实现。这个方法怎么实现与应用密切相关,因此本类只给出一个框架。publicclassConcreteObserverimplementsObserver{publicvoidupdate(){//Writeyourcodeher