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 ...
随机推荐
- Gradle多项目构建
1. 创建项目 首先创建项目,名称为 test: mkdir test && cd test gradle init 这时候的项目结构如下: ➜ test tree . ├── bui ...
- 【转】【C++】ShellExecute, WinExec, CreateProcess 三者的区别
ShellExecute ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件.打开一个目录.打印一个文件等等),并对外部程序有一定的控制. 有几个API函数都可以实现这些功能 ...
- C# 单点登录 MVC
实现sso系统的主要难点: 1:不能直接访问数据库,有安全隐患,而且还容易乱套. 2:多个系统需要进行单点登录,逻辑需要严谨,能支持N多系统.而不只是少数几个系统. 3:代码不能过于复杂,需要简洁,灵 ...
- Ubuntu优化-py用机器
关闭防火墙 ufw disable pip换源 yum install python-pip -y mkdir ~/.pip cat > pip.conf<<a [global] i ...
- JQuery 中 is(':visible') 解析及用法
实例 选择 <body> 元素中每个可见的元素: $("body :visible") 亲自试一试 定义和用法 :visible 选择器选取每个当前是可见的元素. 除以 ...
- perl 简单学习,安装perl模块
检查是否安装了某个perl模块 有多种方式 0.perldoc perlinstall 列出所有的模块及版本号 1. perl -M模块名 -e 1(模块名不加空格) 没有返回值则说明有此模块 2.p ...
- ibatis 到 MyBatis区别(zz)
简介: 本文主要讲述了 iBatis 2.x 和 MyBatis 3.0.x 的区别,以及从 iBatis 向 MyBatis 移植时需要注意的地方.通过对本文的学习,读者基本能够了解 MyBatis ...
- Unity3D独立游戏开发日记(一):动态生成树木
目前写的独立游戏是一个沙盒类型的游戏.游戏DEMO视频如下: 提到沙盒类型的游戏,就有人给出了这样的定义: 游戏世界离现实世界越近,自由度.随机度越高才叫沙盒游戏.所谓自由度,就是你在游戏里想干啥就干 ...
- node 日志
我们主动控制的log4js,还有一些日志是继承好的,错误日志了,进程日志了,请求日志了. 1. var express = require('express');var logger = requir ...
- 第十一课:js操作选择器的通用函数
1.判断文档是否是XML文档 var isXML = function(elem){ var documentElement = elem && (elem.ownerDocument ...