JAVA设计模式 之 观察者模式(JDK内置实现)
简介:使用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内置实现)的更多相关文章
- 观察者模式 - Java 实现1(使用JDK内置的Observer模式)
使用JDK内置的观察者模式 1. 可观察者(主题) 被观察的主题继承 Observable 对象, 使用该对象的调用 notifyObservers() 或 notifyObservers(arg) ...
- 折腾Java设计模式之观察者模式
观察者模式 Define a one-to-many dependency between objects where a state change in one object results in ...
- JDK内置日志系统
1.Java应用中的日志功能 ================= 一般的Java应用程序中都有记录日志的需求,目前主流的记录日志的方法是在应用程序中引入log4j,用log4j来生成日志.其实,JDK ...
- JDK内置性能监测工具使用
Java自带的性能监测工具用法简介——jstack.jconsole.jinfo.jmap.jdb.jsta.jvisualvmJDK内置工具使用 一.javah命令(C Header and Stu ...
- JDK内置工具命令
javap Java反编译工具,主要用于根据Java字节码文件反汇编为Java源代码文件用法:javap 用法 描述 javap -help —help -? 输出此用法消息 javap -versi ...
- JDK内置锁深入探究
一.序言 本文讲述仅针对 JVM 层次的内置锁,不涉及分布式锁. 锁有多种分类形式,比如公平锁与非公平锁.可重入锁与非重入锁.独享锁与共享锁.乐观锁与悲观锁.互斥锁与读写锁.自旋锁.分段锁和偏向锁/轻 ...
- Future模式的学习以及JDK内置Future模式的源码分析
并发程序设计之Future模式 一).使用Future模式的原因 当某一段程序提交了一个请求,期待得到一个答复,但服务程序对这个请求的处理可能很慢,在单线程的环境中,调用函数是同步的,必须等到服务程序 ...
- 理解java设计模式之观察者模式
在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的“观察者模式”,它适 ...
- java设计模式02观察者模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 这里主要讲一下学习内置观察者的记录,在JA ...
随机推荐
- 【原】javascript最佳实践
摘要:这篇文章主要内容的来源是<javascript高级程序设计第三版>,因为第二遍读完,按照书里面的规范,发觉自己在工作中没有好好遵守.所以此文也是对自己书写js的一种矫正. 1.可维护 ...
- Zipf定律
http://www.360doc.com/content/10/0811/00/84590_45147637.shtml 英美在互联网具有绝对霸权 Zipf定律是美国学者G.K.齐普夫提出的.可以表 ...
- JavaWeb学习笔记——JavaBean的保存范围和删除
- JavaWeb学习笔记——javabean
- 利用a标签解析URL
参考资料 http://www.cnblogs.com/Wayou/p/things_you_dont_know_about_frontend.html 很多时候我们有从一个URL中提取域名,查询关键 ...
- centos6.5分区简易操作
fdisk /dev/sdb --->n--->p---->输入分区大小(回车就默认全部大小) mkfs.ext4 /dev/sdb1 mkdir /data 在根目录下新建data ...
- CMake安装(linux)
环境:CentOS6.5 1.下载网址: http://www.cmake.org/download/ (选择linux版本,编译安装) 2.安装 # tar zxvf cmake-.tar.gz # ...
- 关于MarshalByRefObject的解释
http://www.cnblogs.com/webfpc/archive/2010/03/10/1667101.html 首先了解一下不同应用程序域中的对象的通信方式有两种: 一种是跨应用程序域边界 ...
- aufomaper Queryable Extensions ProjectTo
When using an ORM such as NHibernate or Entity Framework with AutoMapper's standard Mapper.Map funct ...
- Hibernate 查询MatchMode的四种模式
Hibernate 查询MatchMode的四种模式 MatchMode.START:字符串在最前面的位置.相当于"like 'key%'" MatchMode.END:字符串在最 ...