简介:使用JAVA内置的帮你搞定观察者模式。

1. 先把类图放在这里:

(1). Observable类追踪所有的观察者,并通知他们。

(2). Observer这个接口看起来很熟悉,它和我们之前写的类几乎一样。

(3). WeatherData这就是我们以前所称的“主题”Subject,从今以后也可以改称为“可观察者”,我们不需要在提供Register(),remove(),notifyObservers()方法。因为我们已经从超类继承了这些行为。

2. 如何把对象编程观察者

如果以前一样,实现观察者接口(java.util.Observer),然后调用任何Observable对象的addObserver()方法,不想在当观察者时,就调用deleteObserver()方法即可。

3. 可观察者如何送出通知

首先,你需要利用扩展java.util.Observable接口产生“可观察者”类,然后,需要两个步骤:

第一:先调用setChanged()方法,标记状态已经改变的事实。

第二:然后调用两种nofityObservers()方法中的一个。

notifyobservers() 或 notifyobservers(Object arg)   当通知时,arg参数为参数将传送给美一个观察者对象。

4. 观察者如何接收通知

同以前一样,观察者实现了更新的方法,但是方法的签名不太一样, 如:

update(Observable o, Object arg)

(1). 将主题本身当做一个对象,好让观察者知道是哪个主题通知它的。

(2). 第二个参数就是传入notityObservers()的数据对象,如果没有说明为空,如果你想“推”数据给观察者对象就用该参数,否则观察者就必须从可观察者拉数据过来。

5. 代码实现

(1)WeatherData.java类, 你可以看到它已经实现了Observable类。

package com.chengzhang.subject;

import java.util.Observable;

public class WeatherData extends Observable {

	private float temperatrue;

	private float humidity;

	private float pressure;

	public WeatherData(){};

	public void measurementsChanged(){
setChanged();
notifyObservers();
} public float getTemperature(){
return temperatrue;
} public float getHumidity(){
return humidity;
} public float getPressure(){
return pressure;
} // 天气发生变化
public void setMeasurements(float temperature, float humidity, float pressure){
this.temperatrue = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
} }

(2). CurrentConditionsDisplay.java类

package com.chengzhang.subject;

import java.util.Observable;
import java.util.Observer; public class CurrentConditionsDisplay implements Observer, Display { private Observable observable; private float temperature; private float pressure; private float humidity; public CurrentConditionsDisplay(Observable observable){
this.observable = observable;
this.observable.addObserver(this);
} @Override
public void update(Observable observable, Object obj) {
if(observable instanceof WeatherData){
WeatherData weatherData = (WeatherData)observable;
this.temperature = weatherData.getTemperature();
this.humidity = weatherData.getHumidity();
this.pressure = weatherData.getPressure();
display();
}
} @Override
public void display() {
System.out.println("当前温度:" + this.temperature);
System.out.println("当期湿度:" + this.humidity);
System.out.println("当期气压:" + this.pressure);
} }

(3). WeatherStation.java类

package com.chengzhang.subject;

public class WeatherStation {

	public static void main(String[] args) {

		WeatherData weatherData = new WeatherData();

		CurrentConditionsDisplay CurrentConditionsDisplay = new CurrentConditionsDisplay(weatherData);

		weatherData.setMeasurements(23, 35, 12);
} }

(4). 输出结果

当前温度:23.0
当期湿度:35.0
当期气压:12.0

JAVA设计模式 之 观察者模式(JDK内置实现)的更多相关文章

  1. 观察者模式 - Java 实现1(使用JDK内置的Observer模式)

    使用JDK内置的观察者模式 1. 可观察者(主题) 被观察的主题继承 Observable 对象, 使用该对象的调用 notifyObservers() 或 notifyObservers(arg) ...

  2. 折腾Java设计模式之观察者模式

    观察者模式 Define a one-to-many dependency between objects where a state change in one object results in ...

  3. JDK内置日志系统

    1.Java应用中的日志功能 ================= 一般的Java应用程序中都有记录日志的需求,目前主流的记录日志的方法是在应用程序中引入log4j,用log4j来生成日志.其实,JDK ...

  4. JDK内置性能监测工具使用

    Java自带的性能监测工具用法简介——jstack.jconsole.jinfo.jmap.jdb.jsta.jvisualvmJDK内置工具使用 一.javah命令(C Header and Stu ...

  5. JDK内置工具命令

    javap Java反编译工具,主要用于根据Java字节码文件反汇编为Java源代码文件用法:javap 用法 描述 javap -help —help -? 输出此用法消息 javap -versi ...

  6. JDK内置锁深入探究

    一.序言 本文讲述仅针对 JVM 层次的内置锁,不涉及分布式锁. 锁有多种分类形式,比如公平锁与非公平锁.可重入锁与非重入锁.独享锁与共享锁.乐观锁与悲观锁.互斥锁与读写锁.自旋锁.分段锁和偏向锁/轻 ...

  7. Future模式的学习以及JDK内置Future模式的源码分析

    并发程序设计之Future模式 一).使用Future模式的原因 当某一段程序提交了一个请求,期待得到一个答复,但服务程序对这个请求的处理可能很慢,在单线程的环境中,调用函数是同步的,必须等到服务程序 ...

  8. 理解java设计模式之观察者模式

    在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的“观察者模式”,它适 ...

  9. java设计模式02观察者模式

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 这里主要讲一下学习内置观察者的记录,在JA ...

随机推荐

  1. 提交 git 项目 到 github 在 centos 7

    Git 是分布式版本控制系统(Distributed Version Control System,简称 DVCS),它可以备份文件的历史信息,多个终端可以同时对文件作修改. 文件内容如果有了变化和之 ...

  2. JavaScript函数之美~

    JavaScript函数之美~ 这篇文章,我将就以下几个方面来认识JavaScript中的函数. 函数为什么是对象,如何定义函数? 如何理解函数可以作为值被传递 函数的内部对象.方法以及属性 第一部分 ...

  3. Install latest R for ubuntu

    ### delete old version rm -rf /usr/local/lib/R /usr/lib/R ~/**/R sudo apt-get autoremove rstudio sud ...

  4. 最近在 OS-10.9下配置opencv, cgal, latex, qt, pillow

    其实我之前使用的Mac os的版本是10.8的雪豹,可是最近想体验一下Mac os10.9新版本,于是就开始更新Mac os,经过10多个小时的下载和成功安装后,发现之前的配置全乱了,首先是发现lat ...

  5. winform的tab跳到下一个

    先设置TabStop=true,再设置TabIndex的顺序

  6. easyui numberbox一些常用属性,方法

    1.value="1234567.89"//数字框中的值 2.precision:2//精度(小数点后两位) 3.groupSeparator:','//(组分隔符) 4.deci ...

  7. HTML5 常用的结构化标签整理

    一.语义化结构化标签 结构化标签优点: 1.方便浏览器处理和识别,提升了网页的质量和语义. 2.减少了大量无意义的div标签,增强代码的可读性. 结构化标签:(header,nav,body,arti ...

  8. sn 密钥注册

    ::打开开发人员命令提示符输入一下内容与证书密码sn -i CanChou.snk.pfx VS_KEY_4B89A33EE2B53C07

  9. 使用Fluent API 配置/映射属性和类型

    Code First约定-Fluent API配置 使用Fluent API 配置/映射属性和类型 简介 通常通过重写派生DbContext 上的OnModelCreating 方法来访问Code F ...

  10. jQuery EasyUI API 中文文档 - ComboGrid 组合表格

    jQuery EasyUI API 中文文档 - ComboGrid 组合表格,需要的朋友可以参考下. 扩展自 $.fn.combo.defaults 和 $.fn.datagrid.defaults ...