http://www.cnblogs.com/jaward/p/3277619.html

1、API

被观察者
java.util.Observable;
public class Observable extends Object
    • 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
 
观察者
java.util.Observer
public interface Observer
    • 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 观察者的更多相关文章

  1. java: 观察者模式:Observable被观察者,Observer观察者

    java: 观察者模式:Observable被观察者,Observer观察者 以房子价格为例,卖房者为被观察者: import java.util.Observable; //被观察者子类化 publ ...

  2. Java 实现观察者(Observer)模式

    1. Java自带的实现 类图 /** * 观察目标 继承自 java.util.Observable * @author stone * */ public class UpdateObservab ...

  3. Java设计模式——Observer(观察者)模式

    在多个对象之间建立一对多的关系,以便当一个对象状态改变的时候.其它全部依赖于这个对象的对象都能得到通知,并被自己主动更新. 适用情况: 当一个抽象模型有两个方面,当中一个方面依赖于还有一方面. 将这二 ...

  4. Java Observer接口和Observable类实现观察者模式

    对于观察者模式,其实Java已经为我们提供了已有的接口和类.对于订阅者(Subscribe,观察者)Java为我们提供了一个接口,JDK源码如下: package java.util; public ...

  5. 十七、 Observer 观察者设计模式

    设计: 代码清单: Observer public interface Observer { void update(NumberGenerator generator); } DigitObserv ...

  6. Observer观察者设计模式

    Observer设计模式主要包括以下两种对象: (1)被观察对象:Subject,它往往包含其他对象感兴趣的东西,上面例子中热水器中就是Subject(被监视对象); (2)观察对象:Observer ...

  7. Observer 观察者

    意图 定义对象间的一种一对多的依赖关系 ,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新. 动机 一致性,松耦合 需要维护相关对象间的一致性.我们不希望为了维持一致性而使各类紧 ...

  8. Observer(观察者)设计模式[转]

    Observer设计模式中主要包括如下两类对象: Subject:监视对象,它往往包含着其他对象所感兴趣的内容.在本范例中,热水器就是一个监视对象,它包含的其他对象所感兴趣的内容,就是tempratu ...

  9. Java的观察者

    class Teacher extends Observable { public void startLesson() { System.out.println(String.format(&quo ...

随机推荐

  1. GIT 专贴

    1.官网 git-scm.com github.com 代码库 2.源码

  2. 静态时序分析(static timing analysis) --- 时序路径

    时序分析工具会找到且分析设计中的所有路径.每一个路径有一个起点(startpoint)和一个终点(endpoint).起点是设计中数据被时钟沿载入的那个时间点,而终点则是数据通过了组合逻辑被另一个时间 ...

  3. C语言 链表的使用(链表的增删查改,链表逆转,链表排序)

    //链表的使用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include< ...

  4. C语言 百炼成钢15

    //题目43:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出 //圈子,问最后留下的是原来第几号的那位. #include<stdio.h> #inclu ...

  5. SpringMVC Controller介绍(转)

    SpringMVC Controller 介绍 一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理 ...

  6. 数据爬取ing

    ing import urllib for i in range(0,1,1): url='****/GetData?loginName=&userName=&beginDate=20 ...

  7. git流程及操作

    一.git认识 git是什么?Git是目前世界上最先进的分布式版本控制系统 二.git安装 三.git创建本地库 1.首先选择e盘新建一个文件夹如douban 2.点击鼠标右键,执行Git Bash ...

  8. QuickFIX/J常见问题汇总

    最近在搞QuickFIX/J,网上的资料不算很多,遇到一些简单的问题都需要google一阵才能找到解决方法,因此做点记录: 错误:Rejecting invalid message: quickfix ...

  9. 在matlab中进行地理坐标和像素坐标的相互转换

    clc;close all;clear; %地理坐标和像素坐标的相互转换 [pic,R]=geotiffread('boston.tif'); %读取带地理坐标信息的tif影像 [m,n,~]=siz ...

  10. 做中学learning by doing——个人感想20155312张竞予

    做中学learning by doing--个人感想 概要 阅读五篇博客后的感触 我的个人技能 个人经验的类比与总结 c语言学习情况 java学习目标及规划 公文写作能力 我的感触 仔细阅读了老师公众 ...