JAVA设计模式 之 观察者模式(JDK内置实现)

时间:2024-04-11 23:37:11

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

1. 先把类图放在这里:

JAVA设计模式 之 观察者模式(JDK内置实现)

(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