Java Observer 观察者
http://www.cnblogs.com/jaward/p/3277619.html
1、API
- void addObserver(Observer o); 如果该观察者集合里面没有这个观察者,添加进去。
- protected void clearChanged(); 把改变的状态清掉,即表示最近没有发生改变,使hasChanged()返回false
- int countObserver(); 返回该Observable对象的观察者个数
- void deleteObserver(Observer o); 删除一个观察者
- boolean hasChanged(); 查看该Observable是否发生了改变
- void notifyObservers(); 先调用hasChanged(),若返回true通知该对象所有观察者,然后用clearChanged()清掉状态
- void notifyObservers(Object o); 同上,上面观察者update()接收的是null,这里可以返回想要通知的数据。
- protected void setChanged(); 设置变化,使到调用hasChanged()会返回true
- void update(Observable o, Object arg); 只要发生变化,notifyObservers()就会通知观察者。
2、用法
被观察类需要继承Observable类,在数据改变的地方(如set***();)里加上setChanged(),在需要监听的地方使用notifyObservers(Object o)。
观察者需实现Observer接口,对notifyObservers() 的提醒做出反应。
为Observable添加观察者。

1 //Test.java
2 import java.util.Observable;
3 import java.util.Observer;
4
5 class Product extends Observable {
6 private String name;
7 private float price;
8
9 public String getName() {
10 return this.name;
11 }
12
13 public void setName(String name) {
14 this.name = name;
15 setChanged();
16 notifyObservers(name);
17 }
18
19 public float getPrice() {
20 return this.price;
21 }
22
23 public void setPrice(float price) {
24 this.price = price;
25 setChanged();
26 notifyObservers(new Float(price));
27 }
28 }
29
30 class NameObserver implements Observer {
31 private String name = null;
32
33 public void update(Observable obj, Object arg) {
34 if (arg instanceof String) {
35 this.name = (String)arg;
36 System.out.println("NameObserver: name change to "+this.name);
37 }
38 }
39 }
40
41 class PriceObserver implements Observer {
42 private float price = 0;
43
44 public void update(Observable obj, Object arg) {
45 if (arg instanceof Float) {
46 price = ((Float)arg).floatValue();
47 System.out.println("PriceObserver: price changte to "+price);
48 }
49 }
50 }
51
52
53 public class Test {
54 public static void main(String args[]) {
55 Product product = new Product();
56
57 NameObserver nameobs = new NameObserver();
58 PriceObserver priceobs = new PriceObserver();
59
60
61 //add observer
62 product.addObserver(nameobs);
63 product.addObserver(priceobs);
64
65
66 product.setName("apple");
67 product.setPrice(9.22f);
68 }
69 }

Java Observer 观察者的更多相关文章
- java: 观察者模式:Observable被观察者,Observer观察者
java: 观察者模式:Observable被观察者,Observer观察者 以房子价格为例,卖房者为被观察者: import java.util.Observable; //被观察者子类化 publ ...
- Java 实现观察者(Observer)模式
1. Java自带的实现 类图 /** * 观察目标 继承自 java.util.Observable * @author stone * */ public class UpdateObservab ...
- Java设计模式——Observer(观察者)模式
在多个对象之间建立一对多的关系,以便当一个对象状态改变的时候.其它全部依赖于这个对象的对象都能得到通知,并被自己主动更新. 适用情况: 当一个抽象模型有两个方面,当中一个方面依赖于还有一方面. 将这二 ...
- Java Observer接口和Observable类实现观察者模式
对于观察者模式,其实Java已经为我们提供了已有的接口和类.对于订阅者(Subscribe,观察者)Java为我们提供了一个接口,JDK源码如下: package java.util; public ...
- 十七、 Observer 观察者设计模式
设计: 代码清单: Observer public interface Observer { void update(NumberGenerator generator); } DigitObserv ...
- Observer观察者设计模式
Observer设计模式主要包括以下两种对象: (1)被观察对象:Subject,它往往包含其他对象感兴趣的东西,上面例子中热水器中就是Subject(被监视对象); (2)观察对象:Observer ...
- Observer 观察者
意图 定义对象间的一种一对多的依赖关系 ,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新. 动机 一致性,松耦合 需要维护相关对象间的一致性.我们不希望为了维持一致性而使各类紧 ...
- Observer(观察者)设计模式[转]
Observer设计模式中主要包括如下两类对象: Subject:监视对象,它往往包含着其他对象所感兴趣的内容.在本范例中,热水器就是一个监视对象,它包含的其他对象所感兴趣的内容,就是tempratu ...
- Java的观察者
class Teacher extends Observable { public void startLesson() { System.out.println(String.format(&quo ...
随机推荐
- SQL SERVER with递归示例一则
WITH SUBQUERY AS ( SELECT ORGID FROM OM_ORGANIZATION WHERE PARENTORGID = 'ROOT' UNION ALL SELECT B.O ...
- js运动框架 step by step
开启setInterval定时器之前,请先清除之前的定时器 window.onload = function() { var btn = document.getElementById('btn'); ...
- 面试准备(四)Java基本数据类型
Java语言是静态类型的(statical typed),也就是说所有变量和表达式的类型再编译时就已经完全确定.由于是statical typed,导致Java语言也是强类型(Strong typed ...
- 最短路径算法之Dijkstra算法(java实现)
前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知 ...
- 通通的最后一篇博客(附自制html5平面射击小游戏一枚)
这是我最后一篇博客了,由于本人的人生规划吧,以后应该也写不出什么好的技术文章了,到现在在博客园写了2年, 今天一看,我也有了120个粉丝,好几万的浏览量,感谢大家的支持啊~~ 半年没有写博客了,由于半 ...
- nodejs初学————安装篇(iis8.5+windows8.1)
nodejs很久前就想玩玩,不过一直没时间,昨晚花了4个小时来捣鼓到iis上架设成功了,废话不说了. PS:我的系统是windows8.1 x64,所以自带iis8.5的,下载的文件也是x64的. N ...
- 获取url据对路径写法
var _absUrl = (function () { var a; return function (url) { if (!a) a = document.createElement('a'); ...
- OpenGLES 2.0 可编程渲染管线
OpenGL ES 2.0 与 OpenGL ES 1.x 渲染管线的最大区别就是: 顶点着色器.片元着色器是可编程的,替代了原来的固定管线的很多功能.
- requirejs自己的学习
1.最新版本的RequireJS压缩后只有14K. 2.模块化,不在使用全局变量,都用块级作用域包装. 3.防止js加载阻止页面渲染. 4.避免出现多个javascript的标签.
- C#基础知识系列八(const和readonly关键字)
前言 不知道大家对const和readonly这两个关键字的区别有什么了解,原来自己之前还真不清楚它们到底是怎么回事,那么如果你也不是很清楚的话,可以一起来探讨一下.在了解这两个关键字的时候我们先来了 ...