观察者模式Observer
初学java的观察者模式,今天总结了下,希望指正。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。
所谓观察者模式,举个例子现在许多购房者都密切观察者房价的变化,当房价变化时,所有购房者都能观察到,以上的购房者属于观察者,这便是观察者模式。
Java中可以借助Observable类和Observer接口轻松实现以上功能。当然此种模式的实现也不仅仅局限于采用这两个类。
java.util.Observable中有两个方法对Observer特别重要
1、setChanged()方法
/**
02. * Sets the changed flag for this {@code Observable}. After calling
03. * {@code setChanged()}, {@code hasChanged()} will return {@code true}.
04. */
05.protected void setChanged() {
06. changed = true;
07.}
2、notifyObservers()方法 / notifyObservers(Object data)方法
/**
02. * If {@code hasChanged()} returns {@code true}, calls the {@code update()}
03. * method for every observer in the list of observers using null as the
04. * argument. Afterwards, calls {@code clearChanged()}.
05. * <p>
06. * Equivalent to calling {@code notifyObservers(null)}.
07. */
08.public void notifyObservers() {
09. notifyObservers(null);
10.}
11.
12./**
13. * If {@code hasChanged()} returns {@code true}, calls the {@code update()}
14. * method for every Observer in the list of observers using the specified
15. * argument. Afterwards calls {@code clearChanged()}.
16. *
17. * @param data
18. * the argument passed to {@code update()}.
19. */
20.@SuppressWarnings("unchecked")
21.public void notifyObservers(Object data) {
22. int size = 0;
23. Observer[] arrays = null;
24. synchronized (this) {
25. if (hasChanged()) {
26. clearChanged();
27. size = observers.size();
28. arrays = new Observer[size];
29. observers.toArray(arrays);
30. }
31. }
32. if (arrays != null) {
33. for (Observer observer : arrays) {
34. observer.update(this, data);
35. }
36. }
37.}
以上两个方法十分重要
setChanged()方法 ——
用来设置一个内部标志位注明数据发生了变化
notifyObservers()方法 / notifyObservers(Object data)方法 ——
通知所有的Observer数据发生了变化,这时所有的Observer会自动调用复写好的update(Observable observable, Object data)方法来做一些处理(比如说画面数据的更新)。
我们可以看到通知Observer有两个方法,一个无参,一个有参。那么这个参数有什么作用呢?
其中一个作用:现在我不想通知所有的Observer,而只想其中一个指定的Observer做一些处理,那么就可以传一个参数作为ID,然后在所有的Observer中判断,每个Observer判断只有接收到底参数ID是属于自己的才做一些处理。
当然参数还有其他作用,我只是举了个例子。
注意: 只有在setChanged()被调用后,notifyObservers()才会去调用update(),否则什么都不干。
示例代码如下:
import java.util.Observable;
import java.util.Observer; class House extends Observable { private float price; public void setPrice(float price) { this.setChanged();// 设置变化点 this.notifyObservers(price);// 通知所有观察者价格改变 this.price = price; } public float getPrice() { return this.price; } public House(float price) { this.price = price; } public String toString() { return "房子价格为: " + this.price; }
} class HousePriceObserver implements Observer { private String name; public HousePriceObserver(String name) { super(); this.name = name; } @Override public void update(Observable o, Object arg) {// 只要改变了 observable 对象就调用此方法 if (arg instanceof Float) { System.out.println(this.name + "观察的价格更改为:" + ((Float) arg).floatValue()); } } } public class ObserTest { public static void main(String[] args) { House house = new House(1000000); HousePriceObserver hpo1 = new HousePriceObserver("购房者A"); HousePriceObserver hpo2 = new HousePriceObserver("购房者B"); HousePriceObserver hpo3 = new HousePriceObserver("购房者C"); house.addObserver(hpo1);// 给房子注册观察者 house.addObserver(hpo2);// 给房子注册观察者 house.addObserver(hpo3);// 给房子注册观察者 System.out.println(house.toString());//输出房子价格 // 修改房子价格,会触发update(Observable o, Object arg)方法通知购房者新的房价信息 house.setPrice(2222222);// System.out.println(house.toString());//再次输出房子价格 }
}
观察者模式Observer相关推荐
- 设计模式:观察者模式--Observer
一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...
- 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)
设计模式 ( 十五 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...
- 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)
观察者模式 Observer 意图 定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新. 别名:依赖(Dependents),发布订阅(Publish-Su ...
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- 观察者模式(Observer) 简介
一, 观察者模式(Observer) 的定义 观察者模式: 定义了一种 1对多 的依赖关系, 让多个观察者对象同时监听1个主题对象. 这个主题对象在状态发生变化时, 会通知所有的观察者对象, 使它 ...
- c++观察者模式observer
c++观察者模式observer 概念 角色和职责 典型应用 案例 概念 Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态. Obs ...
- Javascript乱弹设计模式系列(1) - 观察者模式(Observer)
前言 博客园谈设计模式的文章很多,我也受益匪浅,包括TerryLee.吕震宇等等的.NET设计模式系列文章,强烈推荐.对于我,擅长于前台代码的开发,对于设计模式也有一定的了解,于是我想结合Javasc ...
- 设计模式 - 观察者模式(Observer Pattern) Java内置 用法
观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ...
- 设计模式初探-观察者模式(OBSERVER)又称发布-订阅(Publish-Subscribe)依赖(Dependents)
观察者模式(OBSERVER),又称发布-订阅(Publish-Subscribe),依赖(Dependents),通过定义对象间的一对多的依赖关系,达到当一个对象的状态发生改变时,所有依赖于它的对象 ...
- Android开发中常见的设计模式深入浅出——观察者模式Observer
##最近老大写的Android项目里用到了RxBus然后我就去百度了 让我先了解RxJava 然后RxJava又是由观察者模式的变种写的 所以打算从头学一遍!!! 观察者模式 Observer 顾名思 ...
最新文章
- js返回上一页并刷新代码整理 转
- Android官方开发文档Training系列课程中文版:连接无线设备之通过WIFI创建P2P连接
- 程序员要如何学英语?
- MySQL数据库和Oracle数据库的区别
- 案例:实现用户注册功能
- 最简单的视音频播放示例2:GDI播放YUV, RGB
- 查询SQL的null与''
- Tomcat发生java.lang.OutOfMemoryError: PermGen space的解决方案
- 【BZOJ2654】tree
- java handlerbase_Java Firebase.AuthResultHandler方法代码示例
- win10如何禁用\删除讨厌的ff新鲜事(ff新推荐)(flash弹窗广告)
- 【科学文献计量】Metaknowledge文献数据分析基础(Record、Citation和RecordCollection对象介绍)
- 十分钟搞清字符集和字符编码
- 数码单反相机与无反光镜相机。选择产品摄影解决方案
- 如何查看路由器中的宽带密码
- 计算机电子邮箱格式,英语邮箱格式,电子邮件格式范文!
- 心理测量?预知犯罪?AI可以减少京都之殇吗?
- 特征选择 Relief 方法
- 全球与中国小龙虾市场深度研究分析报告
- 战略决定结构是什么意思?
热门文章
- CloudCC CRM:物联网必将成为CRM的推动力
- 瑞星2009:3大拦截2大防御功能主动遏制木马病毒
- GNS3从入门到精通
- 学习SharePoint记录,微软给出的的Application Templates很有帮助呢
- div table 超出了_div包裹的table,table的宽度超出了的宽度,出现的滚动条的在windows下无法拖动...
- Series和DataFrame、相关性及NaN处理
- Spatial Transformer Networks(STN)
- x = x+1,x+=1,x++那个的执行效率高
- java comparator排序顺序_Java 集合排序策略接口 Comparator
- Linux文件属性3——文件权限管理