1类签名和简介

packagejava.util;public class Observable

Observable是Java内置的观察者模式中的主题类(没错,是类不是接口),和其对应的观察者接口是Observer,观察者模式是JDK中使用最多的模式之一。

观察者模式定义了对象之间的一对多的关系,这样一来,当一个对象(主题)改变状态时,它的所有依赖者(观察者)都会收到通知并自动更新。

Observable内部使用Vector来存储注册的观察者实例,是线程安全的。

注意:jdk将Observable实现为类而不是接口,那么就限制了其使用和复用性,因为Java是单继承的。

2成员属性

private boolean changed = false;private Vector obs;

当changed属性为true时才更行观察者们,该类实现了其set和清除change状态的方法。

obs存储观察者。

protected synchronized voidsetChanged() {

changed= true;

}protected synchronized voidclearChanged() {

changed= false;

}public synchronized booleanhasChanged() {returnchanged;

}

3成员方法

(1)注册

public synchronized voidaddObserver(Observer o) {if (o == null)throw newNullPointerException();if (!obs.contains(o)) {

obs.addElement(o);

}

}

将观察者注册到主题。

(2)注销

public synchronized voiddeleteObserver(Observer o) {

obs.removeElement(o);

}

将观察者从主题中注销

(3)通知

public voidnotifyObservers() {

notifyObservers(null);

}public voidnotifyObservers(Object arg) {//临时数组,存储vector中所有的观察者

Object[] arrLocal;synchronized (this) {if (!changed)return;

arrLocal=obs.toArray();

clearChanged();

}//遍历所有观察者并调用其update方法

for (int i = arrLocal.length-1; i>=0; i--)

((Observer)arrLocal[i]).update(this, arg);

}

4使用Observable实现观察者模式

场景:气象站每次更新气温,都到通知给3个不同的app厂商。

气象站表示主题,用WeatherData类表示。

3个App厂商表示观察者,用App1、App2、App3类表示。

importjava.util.Observable;public class WeatherData extendsObservable {private floattemperature;public voidtempChanged(){

setChanged();

notifyObservers();

}public floatgetTemperature() {returntemperature;

}public void setTemperature(floattemperature) {this.temperature =temperature;

tempChanged();

}

}

主题每次set温度的时候,都会通知所有的观察者,会调用观察者的update进行更新。观察者App1的代码如下(App2和App3一样)

importjava.util.Observable;importjava.util.Observer;public class App1 implementsObserver {

Observable observable;private floattemperature;publicApp1(Observable observable){this.observable =observable;this.observable.addObserver(this);

}

@Overridepublic voidupdate(Observable o, Object arg) {//TODO Auto-generated method stub

if(o instanceofWeatherData){

WeatherData wd=(WeatherData)o;this.temperature =wd.getTemperature();

display();

}

}public voiddisplay(){

System.out.println("当前温度:"+this.temperature+"摄氏度");

}

}

实例化App1的时候会注册到主题,下面是场景测试。

public classTest {public static voidmain(String[] args) {//实例化主题

WeatherData wd = newWeatherData();//实例化观察者,并传入主题

App1 app1 = newApp1(wd);//每次改变温度时,都会通知观察者更新输出。

wd.setTemperature(20);

wd.setTemperature(22);

}

}

运行结果如下:

当前温度:20.0摄氏度

当前温度:22.0摄氏度

完!

observable java_java源码阅读Observable(观察者模式)相关推荐

  1. RxJava 源码解析之观察者模式

    了解 RxJava 的应该都知道是一个基于事务驱动的库,响应式编程的典范.提到事务驱动和响应就不得不说说,设计模式中观察者模式,已经了解的朋友,可以直接跳过观察者模式的介绍,直接到 RxJava 源码 ...

  2. Android之在BaseAdapter源码中了解观察者模式

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/76146635 本文出自:[顾林海的博客] 个人开发的微信小程序,目前功 ...

  3. Rpc框架dubbo-client(v2.6.3) 源码阅读(二)

    接上一篇 dubbo-server 之后,再来看一下 dubbo-client 是如何工作的. dubbo提供者服务示例, 其结构是这样的! dubbo://192.168.11.6:20880/co ...

  4. Vuex源码阅读分析

    Vuex源码阅读分析 Vuex是专为Vue开发的统一状态管理工具.当我们的项目不是很复杂时,一些交互可以通过全局事件总线解决,但是这种观察者模式有些弊端,开发时可能没什么感觉,但是当项目变得复杂,维护 ...

  5. 【Vue原理】Vue源码阅读总结大会

    专注 Vue 源码分享,为了方便大家理解,分为了白话版和 源码版,白话版可以轻松理解工作原理和设计思想,源码版可以更清楚内部操作和 Vue的美,喜欢我就关注我的公众号,好吧兄弟,不会让你失望的 阅读源 ...

  6. 【Vue原理】Vue源码阅读总结大会 - 序

    [Vue原理]Vue源码阅读总结大会 - 序 阅读源码准备了什么 1.掌握 Vue 所有API 2.JavaScript 扎实基础 3.看完 JavaScript 设计模式 4.学会调试 Vue 源码 ...

  7. 应用监控CAT之cat-client源码阅读(一)

    CAT 由大众点评开发的,基于 Java 的实时应用监控平台,包括实时应用监控,业务监控.对于及时发现线上问题非常有用.(不知道大家有没有在用) 应用自然是最初级的,用完之后,还想了解下其背后的原理, ...

  8. centos下将vim配置为强大的源码阅读器

    每日杂事缠身,让自己在不断得烦扰之后终于有了自己的清静时光来熟悉一下我的工具,每次熟悉源码都需要先在windows端改好,拖到linux端,再编译.出现问题,还得重新回到windows端,这个过程太耗 ...

  9. 源码阅读:AFNetworking(十六)——UIWebView+AFNetworking

    该文章阅读的AFNetworking的版本为3.2.0. 这个分类提供了对请求周期进行控制的方法,包括进度监控.成功和失败的回调. 1.接口文件 1.1.属性 /**网络会话管理者对象*/ @prop ...

最新文章

  1. 1.2控制台的大体设置:
  2. 3. SQL -- 存储过程
  3. MySQL之慢查询日志分析
  4. python 添加新元素时如果有重复的不进行添加_清华毕业大佬整理的Python基础22大知识点,自备热水,这货有点干...
  5. RadioGroup和RadioButton(单选框)
  6. 注入工具的原理和开发
  7. java 定时器 的中断程序,STM32定时器中断
  8. python科学计算笔记(四)pandas 数据索引与选取
  9. CoreCLR源码探索(六) NullReferenceException是如何发生的
  10. 【逆强化学习-2】最大熵学习(Maximum Entropy Learning)
  11. [Bzoj]5343: [Ctsc2018]混合果汁
  12. ansys怎么使用anand模型_【干货】经典ANSYS 与 Workbench如何实现联合仿真,相互切换操作。...
  13. ubuntu卸载fcitx后引发的问题修复
  14. HDU 2460 Network(双连通+树链剖分+线段树)
  15. PHP Web Shell in browser
  16. python中有readall吗_在python中使用tn.read_all()读取数据
  17. python识别文字软件_使用Python和大漠插件进行文字识别含软件源码
  18. 永洪BI-通过传输参数控制页面显示多少数据量
  19. 修改Java文件不用重启Tomcat服务
  20. python abs的功能_python abs是什么意思?abs函数有什么用处?

热门文章

  1. nyoj138 哈希的简单应用(查找)
  2. 固态硬盘—国内视频行业的暂时救星?
  3. 在两个林间做Exchange邮箱的迁移
  4. 设计模式---桥接模式
  5. 堆内存 和 栈内存的简单理解 (未完待续~)
  6. JavaWeb:前端开发基础
  7. collections 模块:更多数据结构
  8. 关于生命周期函数dealloc的使用小结
  9. MapReduce整体架构分析
  10. iOS学习笔记-retain/assign/strong/weak/copy/mutablecopy/autorelease区别