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

观察者模式-设计方式-笔记(一)

2012-09-14 
观察者模式-设计模式-笔记(一)出版者+订阅者观察者模式?报纸的订阅?出版者改称为”主题“(Subject),订阅者

观察者模式-设计模式-笔记(一)

出版者+订阅者==观察者模式

?

报纸的订阅

?

出版者改称为”主题“(Subject),订阅者改称为”观察者“(Observer)

?

?

观察者模式定义了一系列对象之间的一对多关系。

?

当一个对象改变状态,其他依赖者都会收到通知。

?

主题:

这样或许不行,只是我必须因此门户大开,让你们全都可以进来取得你们需要的状态,这样太危险了。我不能让你们进来里面大肆挖掘我的各种数据

?

观察者:

为何由你主动送数据过来,而不是让我们主动去向你索取数据?

你 何不提供一些公开的getter方法,让我们”拉“走我们需要的状态?

?

?

?

?

观察者模式定义了对象间的一对多依赖关系,让一个或多个观察者对象观察一个主题对象。当主题对象的状态发生变化时,系统能通知所有的依赖于此对象的观察者对象,从而使得观察者对象能够自动更新。

在观察者模式中,被观察的对象常常也被称为目标或主题(Subject),依赖的对象被称为观察者(Observer)。

下面以一个简单的示例来示范观察者模式,程序先提供一个观察者接口:

程序清单:codes\09\9.3\Observer\Observer.java

程序清单:codes\09\9.3\Observer\PriceObserver.java

接着主程序创建一个Product对象(被观察的目标对象),然后向该被观察对象上注册两个观察者对象,当主程序调用Product对象的setter方法来改变该对象的状态时,注册在Product对象上的两个观察者将被触发。主程序代码如下:

程序清单:codes\09\9.3\Observer\Test.java

运行上面程序,我们将可看到当Product的属性值发生改变时,注册在该Product上的NameObserver和PriceObserver将被触发。

纵观上面介绍的观察者模式,我们发现观察者模式通常包含如下4个角色:

被观察者的抽象基类:它通常会持有多个观察者对象的引用。Java提供了java.util.Observable基类来代表被观察者的抽象基类,所以实际开发中无须自己开发这个角色。

观察者接口:该接口是所有被观察对象应该实现的接口,通常它只包含一个抽象方法update()。Java同样提供了java.util.Observer接口来代表观察者接口,实际开发中也无须开发该角色。

被观察者实现类:该类继承Observable基类。

观察者实现类:实现Observer接口,实现update抽象方法。

理解了上面观察者模式的实现思路之后,可能有读者会感到疑惑:观察者模式的实现方式与Java事件机制的底层实现何其相似啊?实际上,我们完全可以把观察者接口理解成事件监听接口,而被观察者对象也可当成事件源来处理——换个角度来思考:监听,观察,这两个词语之间有本质的区别吗?Java事件机制的底层实现,本身就是通过观察者模式来实现的。

除此之外,观察者模式在Java EE应用中也有广泛应用,主题/订阅模式下的JMS(Java Message Service,Java消息服务)本身就是观察者模式的应用。图9.12显示了主题/订阅模式下JMS的示意图。

?图9.12? 主题/订阅模式下JMS的示意图

从图9.12中可以看出,当Topic主题收到发布者(Publisher)发布的消息时,注册到该主题的所有订阅者(Subscriber)都可收到该消息。实际上,Java EE把这个Topic设计成一个被观察者,而所有订阅者都注册到该被观察者,当发布者发布消息时,该消息将会引起Topic主题的改变,这种改变将会触发注册到该Topic上的所有观察者。

?

?

热点排行