一、java自带的观察者模式
2024-10-18 18:16:00
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);
} }
运行结果:
最新文章
- 解决 adb.exe 停止工作小续
- GO语言学习
- Debian安装python-rrdtool
- Topcoder SRM 597
- Java的四种引用
- 《Code Complete》ch.22 开发者测试
- HeadFirst 13 (包装器, 过滤器) not Finish
- qt QSqlQuery
- Android-RC4的加密解密代码
- 关于在C#中数组(byte[])复制方式
- iOS 切割图片
- aspx界面中,怎么调用后台的方法,处理某个数据
- 老男孩Python全栈开发(92天全)视频教程 自学笔记17
- 用标准3层神经网络实现MNIST识别
- C#中List按特定字段排序
- jmeter javamail 邮件格式再优化(由详情——>;改为统计)
- 全栈开发工程师微信小程序-上(中)
- 洛谷P1020 导弹拦截
- Nestjs 序列化(Serialization)
- Flutter 知识点
热门文章
- CC.NET-自动化发布时 Web.config 文件维护
- gettimeofday(struct timeval *tv, struct timezone *tz)函数
- [置顶] 如何高效使用和管理Bitmap--图片缓存管理模块的设计与实现
- struts2标签库使用小结
- toFixed()要注意的
- java类构造器的理解
- 数据持久层框架iBatis, Hibernate 与 JPA 比较
- JNDI中 java:comp/env 的理解
- Sipdroid实现SIP(五): 用Java实现的UserAgent
- 集合点(lr_rendezvous)