JAVA 观察者模式

观察者模式(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 方法。这个过程通常是由一个线程中顺序执行的。
生产/消费模式中,生产者并不关心消费者的存在,也不知道消费者在什么时候将进行消费操作;同样,消费者也不用关心生产者的存在于生产时机。二者往往通过一个队列联系起来,即生产者线程(可能有多个)只用将产出放入队列,消费者线程(可能有多个)只管从队列中取出消息进行消费。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值