Observer对象是观察者,Observable对象是被观察者。

官网api文档:http://docs.oracle.com/javase/7/docs/api/

1. 实现观察者模式
实现观察者模式非常简单,
[1]创建被观察者类,它继承自java.util.Observable类;
[2]创建观察者类,它实现java.util.Observer接口;
 
  • 对于被观察者类:
添加它的观察者:
void addObserver(Observer o)
addObserver()方法把观察者对象添加到观察者对象列表中

当被观察者中的事件发生变化时,执行

setChanged();
notifyObservers();
setChange()方法用来设置一个内部标志位注明数据发生了变化;notifyObservers()方法会去调用观察者对象列表中所有的Observer的update()方法,通知它们数据发生了变化。
只有在setChange()被调用后,notifyObservers()才会去调用update()。
 
  • 对于观察者类,实现Observer接口的唯一方法update

void update(Observable o, Object arg)

形参Object arg,对应一个由notifyObservers(Object arg);传递来的参数,当执行的是notifyObservers();时,arg为null。

  • 实例:

被观察者:ServerManager

package com.test.observer;

import java.util.Observable;

public class ServerManager extends Observable {
private int data = 0;
public int getData(){ return data; }
public void setData(int i){
if(this.data != i){ this.data = i;setChanged();}
notifyObservers(); //只有在setChange()被调用后,notifyObservers()才会去调用update(),否则什么都不干。 } }
} }

观察者一:AObserver

import java.util.Observable;
import java.util.Observer; public class AObserver implements Observer { public AObserver(ServerManager sm) {
super();
// TODO Auto-generated constructor stub
sm.addObserver(this);  //注册加入观察者
} @Override
public void update(Observable arg0, Object arg1) {
System.out.println("AObserver receive:Data has changed to "+((ServerManager) arg0).getData()); } }

观察者二:BObserver

import java.util.Observable;
import java.util.Observer; public class BObserver implements Observer { public BObserver(ServerManager sm) {
super();
sm.addObserver(this);  //注册加入观察者
} @Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
System.out.println("BObserver receive:Data has changed to "+((ServerManager) o).getData());
} }

测试:

public class TestDemo {

    public static void main(String[] args) {
// TODO Auto-generated method stub
ServerManager sm = new ServerManager();
AObserver a = new AObserver(sm);
BObserver b = new BObserver(sm);
sm.setData(5);
sm.deleteObserver(a);  //注销观察者,以后被观察者有数据变化就不再通知这个已注销的观察者
sm.setData(10);
} }

运行结果:

最新文章

  1. 解决 adb.exe 停止工作小续
  2. GO语言学习
  3. Debian安装python-rrdtool
  4. Topcoder SRM 597
  5. Java的四种引用
  6. 《Code Complete》ch.22 开发者测试
  7. HeadFirst 13 (包装器, 过滤器) not Finish
  8. qt QSqlQuery
  9. Android-RC4的加密解密代码
  10. 关于在C#中数组(byte[])复制方式
  11. iOS 切割图片
  12. aspx界面中,怎么调用后台的方法,处理某个数据
  13. 老男孩Python全栈开发(92天全)视频教程 自学笔记17
  14. 用标准3层神经网络实现MNIST识别
  15. C#中List按特定字段排序
  16. jmeter javamail 邮件格式再优化(由详情——>改为统计)
  17. 全栈开发工程师微信小程序-上(中)
  18. 洛谷P1020 导弹拦截
  19. Nestjs 序列化(Serialization)
  20. Flutter 知识点

热门文章

  1. CC.NET-自动化发布时 Web.config 文件维护
  2. gettimeofday(struct timeval *tv, struct timezone *tz)函数
  3. [置顶] 如何高效使用和管理Bitmap--图片缓存管理模块的设计与实现
  4. struts2标签库使用小结
  5. toFixed()要注意的
  6. java类构造器的理解
  7. 数据持久层框架iBatis, Hibernate 与 JPA 比较
  8. JNDI中 java:comp/env 的理解
  9. Sipdroid实现SIP(五): 用Java实现的UserAgent
  10. 集合点(lr_rendezvous)