Java中内置的观察者模式
Java中内置的观察者模式
Observable类
java.util.Observable
http://docs.oracle.com/javase/7/docs/api/java/util/Observable.html
Observable类用于创建可以观测到你的程序中其他部分的子类。当这种子类的对象发生变化时,观测类被通知。
观测类必须实现定义了update()方法的Observer接口。
当一个观测程序被通知到一个被观测对象的改变时,update()方法被调用。
显然,Observable是一个抽象的主题对象。
一个被观测的对象必须服从下面的两个简单规则:
第一,如果它被改变了,它必须调用setChanged()方法。
第二,当它准备通知观测程序它的改变时,它必须调用notifyObservers()方法,这导致了在观测对象中对update()方法的调用。
注意:如果在调用notifyObservers()方法之前没有调用setChanged()方法,就不会有什么动作发生。
notifyObservers()方法中包含clearChanged()方法,将标志变量置回原值。
notifyObservers()方法采用的是从后向前的遍历方式,即最后加入的观察者最先被调用update()方法。
Observer接口
java.util.Observer
http://docs.oracle.com/javase/7/docs/api/java/util/Observer.html
此接口中只有一个方法:
void update(Observable o, Object arg)
这个方法在被观察对象(Observable类)的notifyObservers()方法中被调用。
程序例子
定义一个主题对象进行倒数计数,数字每次改变时,它的观察者收到这个数字。
一个观察者每次收到通知后打印出数字,另一个观察者在数字小于等于5时才开始打印。
package com.learnjava.observer; import java.util.Observable; import java.util.Observer; class WatchedCounter extends Observable { public void countdown(int number) { for (; number >= 0; --number) { // 设置改变变量 setChanged(); // 通知所有观察者,将number作为参数信息传递给观察者 notifyObservers(number); } } } class Watcher1 implements Observer { @Override public void update(Observable arg0, Object arg1) { System.out.println("Watcher1's number: " + arg1); } } class Watcher2 implements Observer { @Override public void update(Observable arg0, Object arg1) { if (((Integer) arg1).intValue() <= 5) { System.out.println("Watcher2's number: " + arg1); } } } public class ObserverTest { public static void main(String[] args) { WatchedCounter watchedCounter = new WatchedCounter(); Watcher1 watcher1 = new Watcher1(); Watcher2 watcher2 = new Watcher2(); //添加观察者 watchedCounter.addObserver(watcher1); watchedCounter.addObserver(watcher2); //开始倒数计数 watchedCounter.countdown(10); } }
参考资料
张龙老师Java SE系列视频教程。
本博客中关于观察者模式的文章:
Java读书笔记12 事件处理基础 Observer设计模式:
http://www.cnblogs.com/mengdd/archive/2012/09/08/2676587.html
《Head First设计模式》 读书笔记02 观察者模式 Observer:
http://www.cnblogs.com/mengdd/archive/2013/01/03/2843298.html
Java 事件模型基础:监听器、事件、事件源、事件注册:
http://www.cnblogs.com/mengdd/archive/2013/02/06/2908241.html
观察者模式及Java实现例子:
http://www.cnblogs.com/mengdd/archive/2013/02/07/2908929.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了