观察者模式学习之路 idea开发和Eclipse 开发 天气预报系统对注册用户的信息更新

观察者模式学习之路

UML类图

UML

源码实现

此处省略 观察者Sina,CurrentCondition,代码与BaiduSite 类似
package com.atdhl.observer;

//观察者接口,由观察者实现
public interface Observer {

	public void update(float temperature,float pressure, float humidity);
}



package com.atdhl.observer;

public interface Subject {

	public void registerObserver(Observer o);
	public void removeObserver(Observer o);
	public void notifyObserver();
}


package com.atdhl.observer;

public class BaiduSite implements Observer {

	// 温度,气压,湿度
	private float temperature;
	private float pressure;
	private float humidity;

	// 更新天气状况,是由 WeatherData 来调用
	public void update(float temperature, float pressure, float humidity) {
		this.humidity = humidity;
		this.pressure = pressure;
		this.temperature = temperature;
		display();
	}

	// 显示
	public void display() {
		System.out.println("*****Today BdTemperature:" + temperature + "*****");
		System.out.println("*****Today BdPressure:" + pressure + "*****");
		System.out.println("*****Today BdHumidity:" + humidity + "*****");
	}
}



package com.atdhl.observer;

import java.util.ArrayList;
/**
 * 类是核心 1.包含最新的天气情况 
 * 2.含有 观察者集合,使用 ArrayList 管理 
 * 3.当数据又更新时,就主动调用 ArrayList,
 * 4.通知所有的(接入方)就看到最新的信息
 * 
 * @author DHL
 *
 */
public class WeatherData implements Subject {
	private float temperature;
	private float pressure;
	private float humidity;
	
	//观察者集合
		private ArrayList<Observer> observers;
		
	 public WeatherData() {
		// TODO Auto-generated constructor stub
		 observers = new ArrayList<Observer>();
	}

	 public void dataChange() {
		 //调用
		 notifyObserver();
	 }
	 
	 //当有数据更新时,就调用 setData
	 public void setData(float temperature, float pressure,float humidity) {
		 this.humidity = humidity;
		 this.pressure =pressure;
		 this.temperature = temperature;	 
		 dataChange();
	 }	 	 
	 //注册一个观察者
	@Override
	public void registerObserver(Observer o) {
		// TODO Auto-generated method stub
		observers.add(o);
	}	
	//移除一个观察者
	@Override
	public void removeObserver(Observer o) {
		// TODO Auto-generated method stub
		if(observers.contains(o))
		observers.remove(o);
	}

	//通知所有观察者(遍历)
	@Override
	public void notifyObserver() {
		// TODO Auto-generated method stub
		for (int i = 0; i < observers.size();i++) {
			observers.get(i).update(this.temperature, this.pressure,this.humidity);
		}
	}
}

package com.atdhl.observer;

public class client {
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		//创建一个 WeatherData
		WeatherData weatherData = new WeatherData();
		//创建观察者
		CurrentConditions currentConditions = new CurrentConditions();
		BaiduSite baiduSite = new BaiduSite();
		//注册到weatherData
		weatherData.registerObserver(currentConditions);
		weatherData.registerObserver(baiduSite);
		
		
		//测试
		System.out.println("通知各个注册的观察者,看看信息");
		weatherData.setData(10f, 100f, 30.3f);
		
		
		weatherData.removeObserver(currentConditions);
		//测试
		System.out.println();
		System.out.println("通知各个注册的观察者,看看信息");
		weatherData.setData(10f, 100f, 30.3f);
		
	}
}


效果图

结果

发布了31 篇原创文章 · 获赞 3 · 访问量 1146

猜你喜欢

转载自blog.csdn.net/Beyond_Nothing/article/details/105180118