观察者模式-气象站

观察者模式,在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。

1、代码结构:


package observer;

/**
 * 观察者接口
 */
public interface Observer {
	
	/**
	 * 当气象观测值改变时,主题会把这些状态值当作方法的参数,传递给观察者
	 * @param temp 温度
	 * @param humidity 湿度
	 * @param pressure 气压
	 */
	public void update(float temp, float humidity, float pressure);
}

package observer;

/**
 * 布告板
 */
public interface DisplayElement {

	/**
	 * 当布告板需要显示时,调用此方法
	 */
	public void display();
}

package observer;

/**
 * 主题
 */
public interface Subject {
	
	/**
	 * 注册一个观察者
	 * @param o
	 */
	public void registerObserver(Observer o);
	
	/**
	 * 删除一个观察者
	 * @param o
	 */
	public void removeObserver(Observer o);
	
	/**
	 * 当主题改变的时,这个方法会被调用,以通知所有的观察者
	 */
	public void notifyObservers();
}

package observer;

import java.util.ArrayList;

/**
 * 天气数据推送
 */
public class WeatherData implements Subject{

	private ArrayList<Observer> observers;//观察者们
	private float temperature;//温度
	private float humidity;//湿度
	private float pressure;//气压
	
	public WeatherData(){
		observers = new ArrayList<Observer>();
	}
	
	@Override
	public void registerObserver(Observer o) {
		observers.add(o);
	}

	@Override
	public void removeObserver(Observer o) {
		observers.remove(0);
	}

	@Override
	public void notifyObservers() {
		for(Observer o : observers){
			//推送给观察者们
			o.update(temperature, humidity, pressure);
		}
	}
	
	//检测改变
	public void measurementsChanged(){
		notifyObservers();
	}

	//也可以让观察者自己来取
	public ArrayList<Observer> getObservers() {
		return observers;
	}

	//也可以让观察者自己来取
	public float getTemperature() {
		return temperature;
	}

	//也可以让观察者自己来取
	public float getPressure() {
		return pressure;
	}
	
	public void setMeasurements(float temperature, float humidity, float pressure){
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		measurementsChanged();
	}

}

package observer;

public class CurrentConditionsDisplay implements Observer, DisplayElement{
	private float temperature;//温度
	private float humidity;//湿度
	private float pressure;//气压
	private Subject weatherData;
	
	public CurrentConditionsDisplay(Subject weatherData){
		this.weatherData = weatherData;
		weatherData.registerObserver(this);
	}

	@Override
	public void update(float temp, float humidity, float pressure) {
		this.temperature = temp;
		this.humidity = humidity;
		this.pressure = pressure;
		this.display();
	}

	@Override
	public void display() {
		System.out.println("Current conditions:"+temperature +"#" + humidity +"#"+ pressure);
	}
}

package observer;

/**
 * 气象站
 */
public class WeatherStation {
	public static void main(String[] args) {
		WeatherData weatherData = new WeatherData();
		
		CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);
		
		weatherData.setMeasurements(80, 65, 78);
		weatherData.setMeasurements(11, 111, 1111);
		weatherData.setMeasurements(22, 222, 222);
		
	}
	/**
	 * 运行结果:
	 *  Current conditions:80.0#65.0#78.0
		Current conditions:11.0#111.0#1111.0
		Current conditions:22.0#222.0#222.0
	 */
}

java也有内置的观察者模式,但是这边是使用观察者去拉数据的方式,而不是把数据推给观察者

源代码很少,可以去翻阅查询,在java.util包下面

1、代码结构:


package observer1;

/**
 * 布告板
 */
public interface DisplayElement {

	/**
	 * 当布告板需要显示时,调用此方法
	 */
	public void display();
}

package observer1;

import java.util.Observable;

/**
 * 天气数据,继承了‘可观察者’类
 */
public class WeatherData extends Observable{

	private float temperature;//温度
	private float humidity;//湿度
	private float pressure;//气压
	
	//检测改变
	public void measurementsChanged(){
		setChanged();//设置已经改变,这样的手动设置可以控制信息的手动推送
		notifyObservers();
	}
	
	public void setMeasurements(float temperature, float humidity, float pressure){
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		measurementsChanged();
	}

	//也可以让观察者自己来取
	public float getTemperature() {
		return temperature;
	}

	//也可以让观察者自己来取
	public float getPressure() {
		return pressure;
	}

	//也可以让观察者自己来取
	public float getHumidity() {
		return humidity;
	}
}

package observer1;

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

/**
 * 显示当前的气象信息
 */
public class CurrentConditionsDisplay implements Observer,DisplayElement{
	Observable observable;//可观察者
	private float temperature;//温度
	private float humidity;//湿度
	private float pressure;//气压

	public CurrentConditionsDisplay(Observable observable){
		this.observable = observable;
		observable.addObserver(this);
	}
	
	@Override
	public void update(Observable o, Object arg) {
		if(o instanceof WeatherData){
			WeatherData weatherData = (WeatherData) o;
			//从气象数据中进行取得数据
			this.temperature = weatherData.getTemperature();
			this.humidity = weatherData.getHumidity();
			this.pressure = weatherData.getPressure();
			display();
		}
	}

	@Override
	public void display() {
		System.out.println("Current conditions:"+temperature +"#" + humidity +"#"+ pressure);
	}
}

package observer1;

/**
 * 气象站
 */
public class WeatherStation {
	public static void main(String[] args) {
		WeatherData weatherData = new WeatherData();
		
		CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);
		
		weatherData.setMeasurements(80, 65, 78);
		weatherData.setMeasurements(11, 111, 1111);
		weatherData.setMeasurements(22, 222, 222);
		
	}
	/**
	 * 运行结果:
	 *  Current conditions:80.0#65.0#78.0
		Current conditions:11.0#111.0#1111.0
		Current conditions:22.0#222.0#222.0
	 */
}



  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值