在写这个之前偶要说明一下,因为网络上有类似说明。但我觉得太笼统,没有什么条理性,并且基本都是代码说明。所以咯,趁今天有时间,慢慢把JAVA中的观察者设计模式说说清楚。今天我以一个查询银行帐户信息的程序来引入观察者设计模式。

首先呢,此系统包括BanksStatenmentData类,该类存储银行报表的数据:TextDisplay、BarGraphDisplay和PieCharDisplay类,这三个类用于显示数据。此方法是模型->视图->控制器层次结构模式的基本方法,下面的图显示了此系统的设计。

screen.width-500)this.style.width=screen.width-500;" border="0" />

TextDisplay类以文本格式显示数据,BarGraphDisplay类以条形图的格式显示数据,PieCharDisplay以饼分图的格式显示数据。所以我们希望在设计此系统时,BanksStatenmentData对象能够通知对象显示数据的变化,还希望该系统具有疏耦合度---耦合度用于度量系统中类与类之间相互依赖的程度。

疏耦合度介绍---与相互紧密依赖的紧耦合度相比,疏耦合类更容易于重用和修改,对紧耦合系统中类的修改通常引起对该系统中其他类的修改。修改一组疏耦合类中的某个类不需要或只需要较少的修改该组中的其他类。

观察者设计模式适用于类似上图的系统,该模式在源对象与观察者对象之间建立了疏耦合,源对象在其状态改变时通知观察者。在接到源对象的通知时,观察者将响应源对象的变化。在该系统中,BanksStatenmentData对象是源对象,显示数据的对象是观察者。源对象可以通知多个观察者:所以,源对象与观察者之间存在了1对多的关系。

JAVA API中包含了使用观察者设计模式的类。java.util.Observable类代表源。Observable类提供了addObservable方法,它以一个java.util.Observable作为参数。Observer接口允许Observable对象在其状态发生改变时通知Observer。该Observer可以是任何实现Observer接口的类的实例:因为Observable对象调用Observer接口所声明的方法,所以这些类的对象间保持疏耦合。如果开发人员改变某个Observer对Observable对象变化的响应方式,则开发人员无需修改Observable对象。该Observable对象仅通过Observer接口与它的Observer进行交互,这使得对象间为疏耦合。

如果大家看过JAVA中的电梯模拟器案例的话,应该知道电梯模拟器案例分析通过利用观察者设计模式来允许ElevatorModel对象(源)将自身的变化通知给ElevatorView对象(观察者)。该模拟器并没有使用JAVA类库中的Observable类和Observer接口,相反,它使用了定制的ElevatorModelListener接口,该接口提供与Observable接口相似的功能。

Swing GUI组件也采用了观察者设计模式。GUI组件通过与其监听器合作来响应用户交互。比如:ActionListener通过注册为JButton(源)的事件处理程序,来观察该JButton的状态变化。在用户按下JButton时,它将自身状态的改变(即已经按下了该JButton)通知ActionListener对象(观察者).