初学java的观察者模式,今天总结了下,希望指正。

  观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

  这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。

所谓观察者模式,举个例子现在许多购房者都密切观察者房价的变化,当房价变化时,所有购房者都能观察到,以上的购房者属于观察者,这便是观察者模式。

Java中可以借助Observable类和Observer接口轻松实现以上功能。当然此种模式的实现也不仅仅局限于采用这两个类。

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

1、setChanged()方法

/**
02. * Sets the changed flag for this {@code Observable}. After calling
03. * {@code setChanged()}, {@code hasChanged()} will return {@code true}.
04. */
05.protected void setChanged() {
06.    changed = true;
07.}

2、notifyObservers()方法 / notifyObservers(Object data)方法

/**
02. * If {@code hasChanged()} returns {@code true}, calls the {@code update()}
03. * method for every observer in the list of observers using null as the
04. * argument. Afterwards, calls {@code clearChanged()}.
05. * <p>
06. * Equivalent to calling {@code notifyObservers(null)}.
07. */
08.public void notifyObservers() {
09.    notifyObservers(null);
10.}
11.
12./**
13. * If {@code hasChanged()} returns {@code true}, calls the {@code update()}
14. * method for every Observer in the list of observers using the specified
15. * argument. Afterwards calls {@code clearChanged()}.
16. *
17. * @param data
18. *            the argument passed to {@code update()}.
19. */
20.@SuppressWarnings("unchecked")
21.public void notifyObservers(Object data) {
22.    int size = 0;
23.    Observer[] arrays = null;
24.    synchronized (this) {
25.        if (hasChanged()) {
26.            clearChanged();
27.            size = observers.size();
28.            arrays = new Observer[size];
29.            observers.toArray(arrays);
30.        }
31.    }
32.    if (arrays != null) {
33.        for (Observer observer : arrays) {
34.            observer.update(this, data);
35.        }
36.    }
37.}

以上两个方法十分重要

setChanged()方法 ——

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

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

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

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

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

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

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

示例代码如下:

import java.util.Observable;
import java.util.Observer;  class House extends Observable {  private float price;  public void setPrice(float price) {  this.setChanged();// 设置变化点  this.notifyObservers(price);// 通知所有观察者价格改变  this.price = price;  }  public float getPrice() {  return this.price;  }  public House(float price) {  this.price = price;  }  public String toString() {  return "房子价格为: " + this.price;  }
}  class HousePriceObserver implements Observer {  private String name;  public HousePriceObserver(String name) {  super();  this.name = name;  }  @Override  public void update(Observable o, Object arg) {// 只要改变了 observable 对象就调用此方法  if (arg instanceof Float) {  System.out.println(this.name + "观察的价格更改为:"  + ((Float) arg).floatValue());  }  }  }  public class ObserTest {  public static void main(String[] args) {  House house = new House(1000000);  HousePriceObserver hpo1 = new HousePriceObserver("购房者A");  HousePriceObserver hpo2 = new HousePriceObserver("购房者B");  HousePriceObserver hpo3 = new HousePriceObserver("购房者C");  house.addObserver(hpo1);// 给房子注册观察者  house.addObserver(hpo2);// 给房子注册观察者  house.addObserver(hpo3);// 给房子注册观察者  System.out.println(house.toString());//输出房子价格  // 修改房子价格,会触发update(Observable o, Object arg)方法通知购房者新的房价信息  house.setPrice(2222222);//   System.out.println(house.toString());//再次输出房子价格  }
}

观察者模式Observer相关推荐

  1. 设计模式:观察者模式--Observer

    一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...

  2. 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

    设计模式 ( 十五 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...

  3. 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)

    观察者模式 Observer 意图 定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新. 别名:依赖(Dependents),发布订阅(Publish-Su ...

  4. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  5. 观察者模式(Observer) 简介

    一, 观察者模式(Observer) 的定义 观察者模式:   定义了一种 1对多 的依赖关系, 让多个观察者对象同时监听1个主题对象. 这个主题对象在状态发生变化时, 会通知所有的观察者对象, 使它 ...

  6. c++观察者模式observer

    c++观察者模式observer 概念 角色和职责 典型应用 案例 概念 Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态. Obs ...

  7. Javascript乱弹设计模式系列(1) - 观察者模式(Observer)

    前言 博客园谈设计模式的文章很多,我也受益匪浅,包括TerryLee.吕震宇等等的.NET设计模式系列文章,强烈推荐.对于我,擅长于前台代码的开发,对于设计模式也有一定的了解,于是我想结合Javasc ...

  8. 设计模式 - 观察者模式(Observer Pattern) Java内置 用法

    观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ...

  9. 设计模式初探-观察者模式(OBSERVER)又称发布-订阅(Publish-Subscribe)依赖(Dependents)

    观察者模式(OBSERVER),又称发布-订阅(Publish-Subscribe),依赖(Dependents),通过定义对象间的一对多的依赖关系,达到当一个对象的状态发生改变时,所有依赖于它的对象 ...

  10. Android开发中常见的设计模式深入浅出——观察者模式Observer

    ##最近老大写的Android项目里用到了RxBus然后我就去百度了 让我先了解RxJava 然后RxJava又是由观察者模式的变种写的 所以打算从头学一遍!!! 观察者模式 Observer 顾名思 ...

最新文章

  1. js返回上一页并刷新代码整理 转
  2. Android官方开发文档Training系列课程中文版:连接无线设备之通过WIFI创建P2P连接
  3. 程序员要如何学英语?
  4. MySQL数据库和Oracle数据库的区别
  5. 案例:实现用户注册功能
  6. 最简单的视音频播放示例2:GDI播放YUV, RGB
  7. 查询SQL的null与''
  8. Tomcat发生java.lang.OutOfMemoryError: PermGen space的解决方案
  9. 【BZOJ2654】tree
  10. java handlerbase_Java Firebase.AuthResultHandler方法代码示例
  11. win10如何禁用\删除讨厌的ff新鲜事(ff新推荐)(flash弹窗广告)
  12. 【科学文献计量】Metaknowledge文献数据分析基础(Record、Citation和RecordCollection对象介绍)
  13. 十分钟搞清字符集和字符编码
  14. 数码单反相机与无反光镜相机。选择产品摄影解决方案
  15. 如何查看路由器中的宽带密码
  16. 计算机电子邮箱格式,英语邮箱格式,电子邮件格式范文!
  17. 心理测量?预知犯罪?AI可以减少京都之殇吗?
  18. 特征选择 Relief 方法
  19. 全球与中国小龙虾市场深度研究分析报告
  20. 战略决定结构是什么意思?

热门文章

  1. CloudCC CRM:物联网必将成为CRM的推动力
  2. 瑞星2009:3大拦截2大防御功能主动遏制木马病毒
  3. GNS3从入门到精通
  4. 学习SharePoint记录,微软给出的的Application Templates很有帮助呢
  5. div table 超出了_div包裹的table,table的宽度超出了的宽度,出现的滚动条的在windows下无法拖动...
  6. Series和DataFrame、相关性及NaN处理
  7. Spatial Transformer Networks(STN)
  8. x = x+1,x+=1,x++那个的执行效率高
  9. java comparator排序顺序_Java 集合排序策略接口 Comparator
  10. Linux文件属性3——文件权限管理