0
点赞
收藏
分享

微信扫一扫

观察者模式案例用Java内置对象实现

yongxinz 2022-12-12 阅读 94


具体思路参考上一篇博客

import java.util.Observable;
//继承observable,查看源码可以发现,observable已经把注册,添加,删除都做好了,
//我们不在需要做
public class WeatherData extends Observable{
private float temperature;
private float humidity;
private float pressure;
public WeatherData(){

}
//主题值改变时调用
public void measurementsChanged(){
setChanged();//设置当前改变量为true ,这样才可以进行
notifyObservers();
//源码:((Observer)arrLocal[i]).update(this, arg);表示向观察者穿值
}
//和原来的一样,改变主题的值,引起观察者收到信息
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 getHumidity() {
return humidity;
}
public float getPressure() {
return pressure;
}

}

public class CurrentConditionsDisplay implements Observer,DisplayElement{
Observable observable;
private float temperature;
private float humidity;
//传入主题引用,为了把当前观察者放入主题的list中
public CurrentConditionsDisplay(Observable observable){
this.observable=observable;
observable.addObserver(this);
}
//更新后执行,显示,供用户观看
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("Current conditions: "+temperature
+"F degrees and "+humidity+"% humidity");
}
//这个函数供主题调用
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
if(o instanceof WeatherData){
WeatherData weatherData=(WeatherData)o;
this.temperature=weatherData.getTemperature();
this.humidity=weatherData.getHumidity();
display();
}
}
}



测试:

public static void main(String[] args) {
// TODO Auto-generated method stub
WeatherData weatherData=new WeatherData();
CurrentConditionsDisplay currentDisplay=
new CurrentConditionsDisplay(weatherData);
CurrentConditionsDisplay currentDisplay1=
new CurrentConditionsDisplay(weatherData);
weatherData.setMeasurements(80, 65,30.5f);
weatherData.setMeasurements(82, 70,29.2f);
weatherData.setMeasurements(78, 90,29.2f);

举报

相关推荐

0 条评论