观察者模式在Java中有两种实现方式,上文是一种方式,这种方式是自己写代码实现。
另一种方式是使用Java内置的观察者模式来实现。
 
相关的接口和类如下:
java.util.Observable   主题(可观察者)------class
java.util.Observer       观察者                     -------interface
 
 
相关的API如下:
1、java.util.Observable
Observable() 
          构造一个带有零个观察者的 Observable。 
方法摘要 
void addObserver(Observer o) 
          如果观察者与集合中已有的观察者不同,则向对象的观察者集合中添加此观察者。 
protected  void clearChanged() 
          指示对象不再改变,或者它已对其所有的观察者通知了最近的改变,所以 hasChanged 方法将返回 false。 
 int countObservers() 
          返回 Observable 对象的观察者数目。 
 void deleteObserver(Observer o) 
          从对象的观察者集合中删除某个观察者。 
 void deleteObservers() 
          清除观察者列表,使此对象不再有任何观察者。 
 boolean hasChanged() 
          测试对象是否改变。 
 void notifyObservers() 
          如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。 
 void notifyObservers(Object arg) 
          如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。 
protected  void setChanged() 
          标记此 Observable 对象为已改变的对象;现在 hasChanged 方法将返回 true。
 
2、java.util.Observer
void update(Observable o, Object arg) 
          只要改变了 observable 对象就调用此方法。
 
观察API可以发现,java.util.Observable已经对观察者进行管理了,不再需要主题追踪每个观察者了。
 
下面通过Java的内置的观察者模式来重写上个天气应用,部分类代码如下:
import java.util.Observable;

public class WeatherData extends Observable { 
        private float temperature; 
        private float humidity; 
        private float pressure;

public WeatherData() { 
        }

/** 
         * 测量值改变了 
         */ 
        public void measurementsChanged() { 
                setChanged();             //设定改变了 
                notifyObservers();    //通知所有的观察者 
        }

/** 
         * 重新设定了测量值 
         */ 
        public void setMeasurements(float temperature, float humidity, float pressure) { 
                this.temperature = temperature; 
                this.humidity = humidity; 
                this.pressure = pressure; 
                measurementsChanged(); 
        }

public float getTemperature() { 
                return temperature; 
        }

public float getHumidity() { 
                return humidity; 
        }

public float getPressure() { 
                return pressure; 
        } 
}

 
public interface DisplayElement { 
        public void display(); 
}
 
import java.util.Observable; 
import java.util.Observer;

public class CurrentConditionsDisplay implements Observer, DisplayElement { 
        Observable observable; 
        private float temperature; 
        private float humidity;

public CurrentConditionsDisplay(Observable observable) { 
                this.observable = observable; 
                observable.addObserver(this); 
        }

public void update(Observable obs, Object arg) { 
                if (obs instanceof WeatherData) { 
                        WeatherData weatherData = (WeatherData) obs; 
                        this.temperature = weatherData.getTemperature(); 
                        this.humidity = weatherData.getHumidity(); 
                        display(); 
                } 
        }

public void display() { 
                System.out.println("Current conditions: " + temperature 
                                + "F degrees and " + humidity + "% humidity"); 
        } 
}

 
看上面的代码,
java.util.Observable不是接口,是类,如果一个类想具有另一个超类的功能,同时还想拥有Observable行为,就陷入两难地步。
 
实际上,Java内部使用观察者模式也很多,GUI的事件就是典型的观察者模式。
 

本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/201633

设计模式-观察者模式(下)<转>的更多相关文章

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

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

  2. 18. 星际争霸之php设计模式--观察者模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. linkin大话设计模式--观察者模式

    linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...

  4. 朱晔的互联网架构实践心得S1E8:三十种架构设计模式(下)

    朱晔的互联网架构实践心得S1E8:三十种架构设计模式(下) [下载本文PDF进行阅读] 接上文,继续剩下的15个模式. 数据管理模式 16.分片模式:将数据存储区划分为一组水平分区或分片 一直有一个说 ...

  5. js设计模式-观察者模式

    定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ...

  6. 【设计模式】Java设计模式 - 观察者模式

    [设计模式]Java设计模式 - 观察者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 @一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长 ...

  7. [Head First设计模式]山西面馆中的设计模式——观察者模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也不得安生,也发现生活中的很多场景,都可以用设计模式来模拟.原来设计模式就在 ...

  8. 深入浅出设计模式——观察者模式(Observer Pattern)

    模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而 ...

  9. (转)C++设计模式——观察者模式

    转自:http://www.jellythink.com/archives/359 前言 之前做了一个性能测试的项目,就是需要对现在的产品进行性能测试,获得测试数据,然后书写测试报告,并提出合理化的改 ...

随机推荐

  1. RAC安装重新运行root.sh

    rac1执行root.sh成功,rac2执行失败. 在重新执行root.sh前,在rac2上把crs等配置信息删除: # /u01/app//grid/crs/install/rootcrs.pl - ...

  2. Android 报错:Conversion to Dalvik format failed: Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.

    在android高版本开发环境(sdk 4.4)导入低版本(sdk 3.0)的工程时编译报错,报错信息如:Conversion to Dalvik format failed: Unable to e ...

  3. kubernetes 二

    部署harbor Habor是由VMWare中国团队开源的容器镜像仓库.事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获 得了更加广泛的应用,这些新的企业级特性包括 ...

  4. 透析Java本质-谁创建了对象,this是什么

    是构造方法创建的对象吗 package com.java.essence_36; import java.util.ArrayList; import java.util.List; /** * Cr ...

  5. 从jar包中读取资源

    package myspider; import java.io.UnsupportedEncodingException; /** * * @author mark */ public class ...

  6. vnc viewer中开启剪切板复制内容到ubuntu系统中

    说明,本机是ubuntu16,安装的vnc server 是x11vnc,具体安装方法请看之前博文.ubuntu16.4中开启vncserver进行远程桌面 vncviewer on Windows ...

  7. ubuntu中将某一程序设置为开机启动项的方法

    一.简要说明 Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍Linux开机引导的步骤. 加载内核LILO启动之后,如果你选择了Linux作为准备引导的操作系统,第一个被加载 ...

  8. ISE在win8.1的安装问题

    问题1:.lic无法打开 打开:C:\Xilinx\14.6\ISE_DS\ISE\lib\nt64 思路是这样: 将libPortability.dll重命名(加尾缀.orig,意思是origina ...

  9. MYSQL 更改数据库data存储目录 创建用户 创建权限 设置远程访问的权限.

    一. 怎么更改数据库data存储目录:  1. 安装MYSQL. 2. 切换到 C:\Program Files\MySQL\MySQL Server 5.6 3. 新建my.ini. 加入如下配置: ...

  10. jquery资源

    一.时间日期: 倒计时jQuery插件 Countdown :http://code.google.com/p/jquery-countdown/ 使用案例:http://www.tieyou.com ...