您的位置:首页 > 编程语言 > Java开发

JAVA 观察者模式

2018-01-07 21:12 204 查看
观察者模式(Observer/Observable)又常常被称为发布-订阅 (Publish/Subscribe) 模式、源-监听器(Source/Listener) 模式,它旨在实现这样一个目标,当 Observable 发生某种变化时,将这种变化通知给一个或多个 Observable ,使得 Observable 可以监测到其变化,并进行相应的操作。例如在 Web 项目中,我们常常使用 Listener 来监听某件事件的发生(如 HttpSessionListener 可监听 session 的创建与销毁),并进行对应的操作。在 Web 项目中,我们在 web.xml 中注册 Listener,然后由容器负责将事件的发生通知给 Listener 。

观察者模式的完整运行应该包括以下元素和行为。

1) 被观察对象

2) 一个或多个观察者

3) 将观察者与被观察者相关联

4) 被观察对象发生变化

5) 通知所有已注册观察者,并将被观察对象传递给观察者,以便其根据变化内容进行操作。

JDK 自带的类 Observable 和接口 Observer 帮我们实现了上述大部分的需求。Observable 作为被观察对象,其源码如下所示。

public class Observable {
// changed 标志被观察对象是否发生了变化
private boolean changed = false;
// obs 容器来保存观察者
private Vector<Observer> obs;
// 注册观察者
public synchronized void addObserver(Observer o) {
if (o == null)
throw new NullPointerException();
if (!obs.contains(o)) {
obs.addElement(o);
}
}
// 删除观察者
public synchronized void deleteObserver(Observer o) {
obs.removeElement(o);
}
/**
* notifyObservers 方法通知所有已注册观察者。
* 调用观察者的 update(Observable o, Object arg) 方法,通过参数将信息传递给观察者,并执行 update 方法里实现的相应操作。
* */
将被观察对象传递给观察者,同时调用观察者的 update()
public void notifyObservers(Object arg){
//...
}
//...
}


Observer 是一个接口,它只有一个 update(Observable o, Object arg) 方法,接受变化了的被观察者和参数,并由实现这个接口的实际观察者负责完善根据被观察者变化需要执行的操作。

借助 JDK 提供的上述类和接口,我们可以非常方便地实现观察者模式。

在很多场景下,观察者模式和生产/消费模式都能满足业务需求。

简单地说,观察者模式是将 Observer 加入到一个集合中,当 Observable 发生变化时遍历集合中的 Observer ,并且执行其 update 方法。这个过程通常是由一个线程中顺序执行的。

生产/消费模式中,生产者并不关心消费者的存在,也不知道消费者在什么时候将进行消费操作;同样,消费者也不用关心生产者的存在于生产时机。二者往往通过一个队列联系起来,即生产者线程(可能有多个)只用将产出放入队列,消费者线程(可能有多个)只管从队列中取出消息进行消费。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 观察者模式