head first 设计模式:观察者模式2(java_api内置观察者模式)

java API 内置的观察者模式,java.util内包含最基本的Observer接口与Observable类,
这和我们的Subject接口与Observer接口很类似。
Observer接口与Observable类使用上更方便,因为许多功能都已经显示做好了,
你甚至可以使用推(push)或拉(pull)的方式传送数据

观察者调用的顺序是无需的,且,从松耦合的角度考虑,也不应该之间有先后依托关系。

package cn.partner4java.weather2;

import java.util.Observable;



/**
 * 服务对象
 * 我们不需要追踪观察者,也不需要管理注册。
 * @author partner4java
 *
 */
public class WeatherData extends Observable {
	/** 温度 */
	private float temperature;
	/** 湿度 */
	private float humidity;
	/** 气压 */
	private float pressure;
	
	public WeatherData(){
	}
	
	public void measurementsChanged() {
		//来开启状态通知
		setChanged();
		//我们没有调用带参数,表明是拉
//		If this object has changed, as indicated by the hasChanged method, then notify all of its observers and then call the clearChanged method to indicate that this object has no longer changed. 
//		Each observer has its update method called with two arguments: this observable object and null. In other words, this method is equivalent to: 
//		notifyObservers(null)
		notifyObservers();
	}
	
	/**
	 * 设置气象改变数据
	 * @param temperature 温度
	 * @param humidity 湿度
	 * @param pressure 气压
	 */
	public void setMeasurements(float temperature,float humidity,float pressure){
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		measurementsChanged();
	}
	
	

	//下面的这些get方法,是方便与拉取数据
	
	public float getTemperature() {
		return temperature;
	}


	public float getHumidity() {
		return humidity;
	}

	public float getPressure() {
		return pressure;
	}
	
	


}


package cn.partner4java.weather2;

import java.util.Observable;

//实现的java API提供的
import java.util.Observer;

import cn.partner4java.weather.DisplayElement;


/**
 * 当前气象布告板
 * @author partner4java
 *
 */
public class CurrentConditionsDisplay implements Observer, DisplayElement {
	/** 气温 */
	private float temperature;
	/** 湿度 */
	private float humidity;
	
	public CurrentConditionsDisplay(Observable observable){
		observable.addObserver(this);
	}
	
	@Override
	public void update(Observable observable, Object arg) {
		if(observable instanceof WeatherData){
			WeatherData weatherData = (WeatherData) observable;
			this.temperature = weatherData.getTemperature();
			this.humidity = weatherData.getHumidity();
			display();
		}
	}

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

}


package cn.partner4java.weather2;

import java.util.Observable;
import java.util.Observer;

import cn.partner4java.weather.DisplayElement;


/**
 * 天气统计
 * @author partner4java
 *
 */
public class StatisticsDisplay implements Observer, DisplayElement {
	/** 最高温度 */
	private float maxTemp = 0.0f;
	/** 最低温度 */
	private float minTemp = 200;
	/** 记录总温度 */
	private float tempSum = 0.0f;
	/** 温度读取次数 */
	private int countReadings;
	
	public StatisticsDisplay(Observable observable){
		observable.addObserver(this);
	}
	
	@Override
	public void update(Observable observable, Object arg) {
		if(observable instanceof WeatherData){
			WeatherData weatherData = (WeatherData) observable;
			float temperature = weatherData.getTemperature();
			tempSum += temperature;
			countReadings++;
			if(temperature < minTemp){
				minTemp = temperature;
			}else if(temperature > maxTemp){
				maxTemp = temperature;
			}
			display();
		}
		
	
	}

	@Override
	public void display() {
		System.out.println("Avg/Max/Min temperature = " + (tempSum / countReadings)
				+ "/" + maxTemp + "/" + minTemp);
	}

}


package cn.partner4java.weather2.test;

import cn.partner4java.weather2.CurrentConditionsDisplay;
import cn.partner4java.weather2.StatisticsDisplay;
import cn.partner4java.weather2.WeatherData;



/**
 * 气象站测试(启动气象站)
 * @author partner4java
 *
 */
public class WeatherStation {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		WeatherData weatherData = new WeatherData();
		CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
		StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);
		
		weatherData.setMeasurements(80, 234, 20.4f);
		weatherData.setMeasurements(56, 232, 20.4f);
		weatherData.setMeasurements(34, 123, 20.4f);
		
	}

}








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值