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

 

posted @ 2014-05-17 19:27  dcz1001  阅读(412)  评论(0编辑  收藏  举报