一、观察者模式介绍

在Java中通过Observable类和Observer接口实现了观察者模式。一个Observer对象监视着一个Observable对象的变化,当Observable对象发生变化时,Observer得到通知,就可以进行相应的工作

如果画面A是显示数据库里面的数据,而画面B修改了数据库里面的数据,那么这时候画面A就要重新Load。这时候就可以用到观察者模

二、观察者模式实现方法

java.util.Observable中有两个方法对Observer特别重要

①setChanged()方法

/**

* Sets the changed flag for this {@code Observable}. After calling

* {@code setChanged()}, {@code hasChanged()} will return {@code true}.

*/

protected void setChanged() {

changed = true;

}

②notifyObservers()方法 / notifyObservers(Object data)方法

/**

* If {@code hasChanged()} returns {@code true}, calls the {@code update()}

* method for every observer in the list of observers using null as the

* argument. Afterwards, calls {@code clearChanged()}.

*

* Equivalent to calling {@code notifyObservers(null)}.

*/

public void notifyObservers() {

notifyObservers(null);

}

/**

* If {@code hasChanged()} returns {@code true}, calls the {@code update()}

* method for every Observer in the list of observers using the specified

* argument. Afterwards calls {@code clearChanged()}.

*

* @param data

*            the argument passed to {@code update()}.

*/

@SuppressWarnings("unchecked")

public void notifyObservers(Object data) {

int size = 0;

Observer[] arrays = null;

synchronized (this) {

if (hasChanged()) {

clearChanged();

size = observers.size();

arrays = new Observer[size];

observers.toArray(arrays);

}

}

if (arrays != null) {

for (Observer observer : arrays) {

observer.update(this, data);

}

}

}

以上两个方法十分重要

setChanged()方法 ——

用来设置一个内部标志位注明数据发生了变化

notifyObservers()方法 / notifyObservers(Object data)方法 ——

通知所有的Observer数据发生了变化,这时所有的Observer会自动调用复写好的update(Observable observable, Object data)方法来做一些处理(比如说画面数据的更新)。

我们可以看到通知Observer有两个方法,一个无参,一个有参。那么这个参数有什么作用呢?

其中一个作用:现在我不想通知所有的Observer,而只想其中一个指定的Observer做一些处理,那么就可以传一个参数作为ID,然后在所有的Observer中判断,每个Observer判断只有接收到底参数ID是属于自己的才做一些处理。

当然参数还有其他作用,我只是举了个例子。

下面举个例子加以说明:

import java.util.Observable;

/**

* 被观察者类

*/

public class SimpleObservable extends Observable

{

private int data = 0;

public int getData(){

return data;

}

public void setData(int i){

if(this.data != i) {

this.data = i;

setChanged();

//只有在setChange()被调用后,notifyObservers()才会去调用update(),否则什么都不干。

notifyObservers();

}

}

}

上面这个类是一个被观察者类,它继承了Observable类,表示这个类是可以被观察的。

然后在setData()方法里面,也就是数据改变的地方,来调用Observable类的setChanged()方法和notifyObservers()方法,表示数据已改变并通知所有的Observer调用它们的update()方法做一些处理。

注意:只有在setChange()被调用后,notifyObservers()才会去调用update(),否则什么都不干。

/**

* 观察者类

*/

public class SimpleObserver implements Observer

{

public SimpleObserver(SimpleObservable simpleObservable){

simpleObservable.addObserver(this );

}

public void update(Observable observable ,Object data){  // data为任意对象,用于传递参数

System.out.println(“Data has changed to” + (SimpleObservable)observable.getData());

}

}

通过生成被观察者(SimpleObservable类)的实例,来调用addObserver(this)方法让观察者(SimpleObserver类)达到观察被观察者(SimpleObservable类)的目的。

然后还要复写update()方法,做数据改变后的一些处理。

下面可以写一个简单的测试类来测试一下

public class SimpleTest

{

public static void main(String[] args){

SimpleObservable doc = new SimpleObservable ();

SimpleObserver view = new SimpleObserver (doc);

doc.setData(1);

doc.setData(2);

doc.setData(2);

doc.setData(3);

}

}

运行结果如下

[plain] view plain copy

Data has changed to 1

Data has changed to 2  //第二次setData(2)时由于没有setChange,所以update没被调用

Data has changed to 3

下面介绍一个Observable类的其他一些属性和方法

属性 ——

// observers是一个List,保存着所有要通知的observer。

List observers = new ArrayList();

// changed是一个boolean型标志位,标志着数据是否改变了。

boolean changed = false;

方法 ——

// 添加一个Observer到列表observers中

public void addObserver(Observer observer) {

if (observer == null) {

throw new NullPointerException();

}

synchronized (this) {

if (!observers.contains(observer))

observers.add(observer);

}

}

// 从列表observers中删除一个observer

public synchronized void deleteObserver(Observer observer) {

observers.remove(observer);

}

// 清空列表observers

public synchronized void deleteObservers() {

observers.clear();

}

// 返回列表observers中observer的个数

public int countObservers() {

return observers.size();

}

// 重置数据改变标志位为未改变

protected void clearChanged() {

changed = false;

}

// 将数据改变标志位设置为改变

protected void setChanged() {

changed = true;

}

// 判断标志位的值

public boolean hasChanged() {

return changed;

}

// 通知所有observer(无参)

public void notifyObservers() {

notifyObservers(null);

}

// 通知所有observer(有参)

@SuppressWarnings("unchecked")

public void notifyObservers(Object data) {

int size = 0;

Observer[] arrays = null;

synchronized (this) {

if (hasChanged()) {

clearChanged();

size = observers.size();

arrays = new Observer[size];

observers.toArray(arrays);

}

}

if (arrays != null) {

for (Observer observer : arrays) {

observer.update(this, data);

}

}

}

注意:在Observer对象销毁前一定要用deleteObserver将其从列表中删除,也就是在onDestroy()方法中调用deleteObserver()方法。

不然因为还存在对象引用的关系,Observer对象不会被垃圾收集,造成内存泄漏,并且已死的Observer仍会被通知到,有可能造成意料外的错误,而且随着列表越来越大,notifyObservers操作也会越来越慢。

java observer update_Java_观察者模式(Observable和Observer) -转相关推荐

  1. java observer update_Java_观察者模式(Observable和Observer)

    java.util.Observable中有两个方法对Observer特别重要 ①setChanged()方法 /** * Sets the changed flag for this {@code  ...

  2. 设计模式之观察者模式(Observable与Observer)

    1.什么是观察者模式 简单情形:有A.B.C.D等四个独立的对象,其中B.C.D这三个对象想在A对象发生改变的第一时间知道这种改变,以便做出相应的响应或者对策. 上面的这种情形,就是观察者模式. 当然 ...

  3. Java设计模式之观察者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  4. Java中使用Observer接口和Observable类实践Observer观察者模式

    在Java中通过Observable类和Observer接口实现了观察者模式.实现Observer接口的对象是观察者,继承Observable的对象是被观察者. 1. 实现观察者模式 实现观察者模式非 ...

  5. Java Observer Pattern(观察者模式)

    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于行为型模式. 关键代码:在抽象类里有一个 ArrayL ...

  6. JAVA中的观察者模式observer

    简介: 在java.util包下, 观察者继承observable类,设置变化点setChanged();通知改变的内容notifyObservers(); 被观察者继承observer接口,覆写uo ...

  7. Observable与Observer

    在Java中通过Observable类和Observer接口实现了观察者模式.一个Observer对象监视着一个Observable对象的变化,当Observable对象发生变化时,Observer得 ...

  8. Observer(观察者模式)

    文章目录 什么是观察者模模式 观察者模式结构图 案例实现 Java内置观察者模式实现 什么是观察者模模式 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种 ...

  9. 设计模式记--Observer Pattern观察者模式

    观察者模式--定义了对象之间的一对多依赖,这样一来,当一个对像改变状态时,它的所有依赖者都会收到通知并自动更新.   从定义可以看出,OBSERVER(观察者)模式逻辑上需要两组对象来实现.首先它必需 ...

最新文章

  1. 网件r4500刷第三方固件_网件R6800刷PandoraBox固件,激发潜在的160MHz频宽
  2. java 页面传输中文乱码解决方式
  3. JLink接口的SWD接法
  4. plsql查询中补入空行--做报表分页挺有用
  5. Asp.net 面向接口框架之应用程序上下文作用域组件
  6. Python获取环境变量值
  7. 浅谈压缩感知(十六):感知矩阵之RIP
  8. gerber文件怎么导贴片坐标_SMT贴片加工有哪些常用的名词
  9. 虚拟麦克风音频输入_Au音频效果(合集)
  10. 计算机实验室安全员责任书,实验室安全目标责任书
  11. 手游联运系统包括什么功能?
  12. IPD——从战略到执行的全面研发管理体系
  13. 热门的XDR到底是一类什么样安全产品?
  14. java三角形边长_java三角形怎么求边?
  15. 秀米怎么用html模板,秀 米 模 板 不 够 用 ?
  16. 从敏思博客的倒闭事件看历史重现... 1
  17. 创业过程中的63个技术问题
  18. Maven创建时archetype的选择说明
  19. mysql数据库实体_关系型数据库中实体之间的关系
  20. 创业赢利模式之一 鱼模式

热门文章

  1. 关于windows安装过程中“我们无法创建新的分区,也找不到现有的分区”问题解决办法
  2. 【rocketMq-1】基础入门
  3. php 单线程还是多,php语言是单线程吗?
  4. 联想拯救者ISK游戏本加装固态硬盘和系统迁移
  5. anaconda命令行
  6. MySQL命令行登入
  7. WebSocketClient设置代理Proxy
  8. HTTP协议请求错误总结
  9. PHP 毕生功力 图片,凝聚毕生功力
  10. Java基础—IO流(三)