JAVA设计模式之Observer模式

时间:2024-03-27 09:11:22

观察者模式,在开发中经常使用到。特别是在UI层,那么什么是观察者模式呢?观察者模式,有以下几个要点。

1、被观察者和观察者是一对多的关系,也就是同一个被观察者可以被多个观察者来观察。这样,在实现被观察者的时候,需要用一个集合的数据结构来存放所有观察该对象的观察者。

2、观察者要想观察被观察者,需要将自身注册给被观察者。

3、被观察者的属性发生变化的时候,需要通知所有注册了自己的观察者。

4、被观察者决定,哪些属性发生变化了,通知所有观察者。

java已经将Observer模式加入JDK中了,在java.util包下,分别有Observer接口和Observable类。所以,我们定义的观察者实现Observer接口就可以了,而被观察者继承Observable就可以了,在某属性变化的时候,使用setChanged(),和notifyObservers(args)就可以了。然后,在使用的时候,注册观察者,使用addObserver(Observer)就可以了。

观察者模式的组件结构如下:

JAVA设计模式之Observer模式

可以看到,Observer中只有一个update方法,这个方法就是,当被观察者的属性发生改变的时候,该方法会被调用。

在java的jdk中,还有另外一组模型,这组模型是基于事件处理的模式,包含EventListener标识接口,EventObject事件对象,下面我们看看使用这个模型来实现事件监听的组件结构,如下图:

JAVA设计模式之Observer模式

由于EventListener接口没有任何方法申明,我们继承该接口自定义一个接口SampleEventListener,其中包含一个处理事件的方法

SampleEvent继承了EventObject事件对象,该对象包含了一个对事件源(EventSource)的引用。EventSource中包含了一个Vector集合对象用来保存所有注册了的监听器对象。

这样,当事件源(EventSource)触发notifyListeners()方法时,Vector中所有Listener就会调用handleEvent(SampleEvent)方法,

然后在该方法中处理事件。这样,事件源经过事件的包装,成为事件的属性之一,然后传递给监听器来处理。这里我们可以看到,这里的监听器(Listener)就相当于Observer,而EventSource就相当于Observable。

对于Observer形式的观察者模式和Event的观察者模式,是相似又有区别的。

Observer中的Observable已经封装好了很多操作,而且,不分事件源和事件,将其合并成为一个Obsevable对象。

这两种方式都可以来实现观察者模式。