首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计形式——观察者模式(Observer)

2013-07-09 
设计模式——观察者模式(Observer)?图1、观察者模式的静态结构可从类图中看清楚?在观察者模式里有如下的角色:

设计模式——观察者模式(Observer)

?图1、观察者模式的静态结构可从类图中看清楚

?

在观察者模式里有如下的角色:

?

1.抽象主题(Subject)角色

主题角色把所有的观察者对象的引用保存在一个列表里;每个主题都可以有任何数量的观察者。主题提供一个接口可以加上或撤销观察者对象;主题角色又叫做抽象被观察者(Observable)角色;?


设计形式——观察者模式(Observer)
?图2、抽象主题角色,有时又叫做抽象被观察者角色,可以用一个抽象类或者一个接口实现;在具体的情况下也不排除使用具体类实现。

?

2.抽象观察者(Observer)角色

为所有的具体观察者定义一个接口,在得到通知时更新自己;?


设计形式——观察者模式(Observer)

图3、抽象观察者角色,可以用一个抽象类或者一个接口实现;在具体的情况下也不排除使用具体类实现

?

3.具体主题(ConcreteSubject)角色

保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;具体主题角色又叫作具体被观察者角色;


设计形式——观察者模式(Observer)

?

图4、具体主题角色,通常用一个具体子类实现

?

4.具体观察者(ConcreteObserver)角色

保存一个指向具体主题对象的引用;和一个与主题的状态相符的状态。具体观察者角色实现抽象观察者角色所要求的更新自己的接口,以便使本身的状态与主题的状态自恰。

设计形式——观察者模式(Observer)
?图5、具体观察者角色,通常用一个具体子类实现

三、Java语言提供的对观察者模式的支持

在Java语言的java.util库里面,提供了一个Observable类以及一个Observer接口,构成Java语言对观察者模式的支持。

?

1.Observer接口

这个接口只定义了一个方法,update()。当被观察者对象的状态发生变化时,这个方法就会被调用。这个方法的实现应当调用每一个被观察者对象的notifyObservers()方法,从而通知所有的观察对象。

设计形式——观察者模式(Observer)
?图6、java.util提供的Observer接口的类图。

?

2.Observable类

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

java.util.Observable类还有其它的一些重要的方法。比如,观察者对象可以调用java.util.Observable类的addObserver()方法,将对象一个一个加入到一个列表上。当有变化时,这个列表可以告诉notifyObservers()方法那些观察者对象需要通知。由于这个列表是私有的,因此java.util.Observable的子对象并不知道观察者对象一直在观察着它们。


设计形式——观察者模式(Observer)
?图7、Java语言提供的被观察者的类图

这个Observable类代表一个被观察者对象。一个被观察者对象可以有数个观察者对象,一个观察者可以是一个实现Observer接口的对象。在被观察者对象发生变化时,它会调用Observable的notifyObservers方法,此方法调用所有的具体观察者的update()方法,从而使所有的观察者都被通知更新自己。见下面的类图:

设计形式——观察者模式(Observer)
?图8、使用Java语言提供的对观察者模式的支持

发通知的次序在这里没有指明。Observerable类所提供的缺省实现会按照Observers对象被登记的次序通知它们,但是Observerable类的子类可以改掉这一次序。子类并可以在单独的线程里通知观察者对象;或者在一个公用的线程里按照次序执行。?

当一个可观察者对象刚刚创立时,它的观察者集合是空的。两个观察者对象在它们的equals()方法返回true时,被认为是两个相等的对象。?

?

四、怎样使用Java对观察者模式的支持

为了说明怎样使用Java所提供的对观察者模式的支持,本节给出一个非常简单的例子。在这个例子里,被观察对象叫做Watched,也就是被监视者;而观察者对象叫做Watcher。Watched对象继承自java.util.Obsevable类;而Watcher对象实现了java.util.Observer接口。另外有一个对象Tester,扮演客户端的角色。?

这个简单的系统的结构如下图所示。


设计形式——观察者模式(Observer)
?图9、一个使用Observer接口和Observable类的例子

?

package com.Observer;import java.util.Observer;public class Tester {public static void main(String[] args) {//被观察者对象Watched watched = new Watched();//观察者对象Observer watcher = new Watcher();//注册Observerwatched.addObserver(watcher);watched.changeData("In C, we create bugs.");watched.changeData("In Java, we inherit bugs.");watched.changeData("In Java, we inherit bugs.");watched.changeData("In Visual Basic, we visualize bugs.");}}

?

?

??

?

?

热点排行