源码分析Java的观察者模式
来源:互联网 发布:数据分析系统 编辑:程序博客网 时间:2024/05/16 11:29
java中的观察者模式,简而言之就是多个对对象对一个对象的观察,当被观察者改变时,会通知观察者。Java为这种模式,特地的提供Observable类和Observer接口实现这种模式,先看下面的代码实现观察者模式
被观察者类
class Sub extends Observable{ private String msg; public String getmsg(){ return msg; } public void setmsg(String msg){ this.msg=msg; setChanged(); notifyObservers(); }}class Sub1 extends Observable{ private String msg; public String getmsg(){ return msg; } public void setmsg(String msg){ this.msg=msg; setChanged(); notifyObservers(); }}
观察者
class obser implements Observer{ public void registerObject(Observable o){ o.addObserver(this); } public void update(Observable arg0, Object arg1) { // TODO Auto-generated method stub if(arg0 instanceof Sub){ Sub oo=(Sub)arg0; System.out.println("接受到Sub改变"+oo.getmsg()); } if(arg0 instanceof Sub1){ Sub1 oo=(Sub1)arg0; System.out.println("接受到Sub1改变"+oo.getmsg()); } }
主程序
public class test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Sub s1=new Sub(); Sub1 s2 = new Sub1(); obser o1=new obser(); obser 02=new obser(); obser o3=new obser(); o1.registerObject(s1); o2.registerObject(s2); o3.registerObject(s1); s1.setmsg("aaa"); s2.setmsg("bbb"); }}
解释一下代码,最前面定义两个被观察者,后面定义一个观察者类,在主函数里面,两个观察者对s1,一个对s2,当被观察的对象,信息发生改变是就就会通知观察者,这个程序运行结果为:
符合我们的预期,现在分析一下这段代码
public void setmsg(String msg){ this.msg=msg; setChanged(); notifyObservers(); }
我们是通过调用被观察者的setmsg触发,通知观察者,setChanged()和notifyObservers(),来看一下这段代码,直接贴Observable源码
package java.util;public class Observable { private boolean changed = false; private Vector obs; public Observable() { obs = new Vector(); } public synchronized void addObserver(Observer o) { if (o == null) throw new NullPointerException(); if (!obs.contains(o)) { obs.addElement(o); } }public synchronized void deleteObserver(Observer o) { obs.removeElement(o); }public void notifyObservers() { notifyObservers(null); } public void notifyObservers(Object arg) { Object[] arrLocal; synchronized (this) { if (!changed) return; arrLocal = obs.toArray(); clearChanged(); } for (int i = arrLocal.length-1; i>=0; i--) ((Observer)arrLocal[i]).update(this, arg); }public synchronized void deleteObservers() { obs.removeAllElements(); }protected synchronized void setChanged() { changed = true; }protected synchronized void clearChanged() { changed = false; }public synchronized boolean hasChanged() { return changed; } public synchronized int countObservers() { return obs.size(); }}
Oberverable这个类,里面定义一个Vector容器来装载自己的观察者,然后notifyObservers()这个函数,就会每一个调用每一个观察者的update()函数,实现通知的效果。然后你可以在复写Observer这个接口的实现通过采用instanceof来判断属于哪一个类,实现具体的操作。
阅读全文
0 0
- 源码分析Java的观察者模式
- java观察者模式&源码自带观察者模式分析
- 观察者设计模式--listView的源码分析
- 通过Java源码分析初探观察者模式(一)
- 观察者模式的分析
- java源码实现观察者模式
- RxJava 源码解读分析 观察者模式
- java的观察者模式
- java的观察者模式
- 观察者模式II--Java原生实现分析以及一种全新的观察者模式
- Android 最常用的设计模式三 安卓源码分析—Observer观察者模式
- java 观察者模式利与弊分析
- Java 观察者模式的浅析
- Java 观察者模式的浅析
- Java 观察者模式的浅析
- Java 观察者模式的浅析
- Java 观察者模式的浅析
- Java 观察者模式的浅析
- 集线器、网桥、交换机、路由器、网关大解析
- 网络请求
- more effective C++条款十解析
- C++程序设计原理与实践之GUI程序实现问题
- pycharm 解除默认unittest模式
- 源码分析Java的观察者模式
- es 集群分片数据转移处理
- Linux_networking_programing(Linux网络编程总结)
- 求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。
- i2c设备与驱动匹配过程
- 用户与我的关系数据库设计与数据传递
- 集合
- C++main函数参数以及含义
- Android 常用颜色值及半透明效果配置