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 ...
随机推荐
- 【转】【C#】【Thread】【Task】多线程
多线程 多线程在4.0中被简化了很多,仅仅只需要用到System.Threading.Tasks.::.Task类,下面就来详细介绍下Task类的使用. 一.简单使用 开启一个线程,执行循环方法,返回 ...
- C# 类型运算符重载在类继承中的调用测试
这是一篇晦涩难懂的片面的研究 一,简单的继承层次 class CA { } class CB : CA{ } class CC : CB{ } } void Test(CA oa){//CATest ...
- C#中事件的继承
C#中的子类无法调用父类的事件,可以通过在父类中创建一个方法来调用父类的事件,而子类通过调用父类的方法来触发事件. class parent { protected string name; publ ...
- 20145215实验五 Java网络编程及安全
20145215实验五 Java网络编程及安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验步骤 本次实验我的结对编程对象是20145208蔡野,我负责编写客 ...
- Thrift搭建分布式微服务(一)
一.Thrift是什么? 关于Thrift的基本介绍,参看张善友的文章Thrift简介. 二.为什么使用微服务? 在公司的高速发展过程中,随着业务的增长,子系统越来越多.各系统间又不同程度的在某些逻辑 ...
- Python学习笔记:魔术方法详解
准备工作 为了确保类是新型类,应该把 _metaclass_=type 入到你的模块的最开始. class NewType(Object): mor_code_here class OldType: ...
- 定一个小目标:明年1024能成功转行web前端,光荣地成为一个程序员!
第一次在博客园写博,我为什么要选择这里吗? 据说博客园这里的IT大牛如云,作为一个求知若渴的小白,我屁颠屁颠的跟着过来了. 于是今天早上兴高采烈的注册了账号,迫不及待的打开我的博客,呃!注册账号成功了 ...
- [AaronYang]C#人爱学不学8[事件和.net4.5的弱事件深入浅出]
没有伟大的愿望,就没有伟大的天才--Aaronyang的博客(www.ayjs.net)-www.8mi.me 1. 事件-我的讲法 老师常告诉我,事件是特殊的委托,为委托提供了一种发布/订阅机制. ...
- 第十章:Javascript子集和扩展
本章讨论javascript的集和超集,其中子集的定义大部分处于安全考虑.只有使用这门语言的一个安全的子集编写脚本,才能让代码执行的更安全.更稳定.ECMScript3标准是1999年版本的,10年后 ...
- 第五次课堂总结x
一.知识点: 1.while语句 循环体语句: while语句里的表达式可以是任何合法的表达式,循环体则只可以表达一条语句. while的循环体语句需要能改变循环条件的真假条件. ...