

package com.observer;
/**
* 这个是核心类(可以理解成气象观测站,他这里有最新的天气情况)
* 1.包含最新的天气情况信息
* 2.含有CurrentConditions 对象
* 3.当数据有更新的时候,就主动的调用 CurrentConditions 对象的 update方法(含display方法),这样他们(接入方)就看到了最新的信息
*
*/
public class WeatherData {
private float temperature;//温度
private float pressure;//气压
private float humidity;//湿度
private CurrentConditions currentConditions;
public WeatherData(CurrentConditions currentConditions){
this.currentConditions=currentConditions;
}
public float getTemperature() {
return temperature;
}
public float getPressure() {
return pressure;
}
public float getHumidity() {
return humidity;
}
public void dataChange(){
//调用接入方的update()
currentConditions.update(getTemperature(),getPressure(),getHumidity());
}
//当有数据更新的时候,就调用setData
public void setData(float temperature,float pressure,float humidity){
this.temperature=temperature;
this.pressure=pressure;
this.humidity=humidity;
//调用dataChange,将最新的信息 推送给 接入方(也就是currentConditions)
dataChange();
}
}
package com.observer;
/**
* 显示当前天气情况(可以理解成是气象局自己的网站需要展示天气情况【当然还有百度、新浪等网站也需要展现天气情况】)
*/
public class CurrentConditions {
private float temperature;//温度
private float pressure;//气压
private float humidity;//湿度
//更新天气情况,是由WeatherData类来调用,使用推送模式
public void update(float temperature,float pressure,float humidity){
this.temperature=temperature;
this.pressure=pressure;
this.humidity=humidity;
//更新完成之后,进行展示
display();
}
//显示
private void display() {
System.out.println("today temperature:"+temperature);
System.out.println("today pressure:"+pressure);
System.out.println("today humidity:"+humidity);
}
}
package com.observer;
import com.alibaba.fastjson.JSON;
import java.util.Map;
/**
* 模拟客户端进行调用
*/
public class Client {
public static void main(String[] args) {
//创建接入方 CurrentConditions
CurrentConditions currentConditions = new CurrentConditions();
//创建 WeatherData 并将接入方 currentConditions 传递到WeatherData中去
WeatherData weatherData = new WeatherData(currentConditions);
//更新天气情况
weatherData.setData(30,100,50);
//天气发生变化
System.out.println("=====天气发生变化=====");
weatherData.setData(20,200,60);
}
}
运行结果:
today temperature:30.0 today pressure:100.0 today humidity:50.0 =====天气发生变化===== today temperature:20.0 today pressure:200.0 today humidity:60.0

代码
package com.observer.improve;
//接口,让WeatherData来实现
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObservers();
}
package com.observer.improve;
import com.observer.CurrentConditions;
import java.util.ArrayList;
/**
* 这个是核心类(可以理解成气象观测站,他这里有最新的天气情况)
* 1.包含最新的天气情况信息
* 2.含有观察者集合,使用Arraylist管理
* 3.当数据有更新的时候,就主动的调用 Arraylist, 通知所有的接入方,就能够看到最新的信息
*/
public class WeatherData implements Subject {
private float temperature;//温度
private float pressure;//气压
private float humidity;//湿度
private ArrayList<Observer> observers;//观察者集合
public WeatherData() {
observers = new ArrayList<Observer>();
}
public float getTemperature() {
return temperature;
}
public float getPressure() {
return pressure;
}
public float getHumidity() {
return humidity;
}
public void dataChange() {
//调用接入方的update()
notifyObservers();
}
//当有数据更新的时候,就调用setData
public void setData(float temperature, float pressure, float humidity) {
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
//调用dataChange,将最新的信息 推送给 接入方(也就是currentConditions)
dataChange();
}
//下面这三个是核心的方法
/**
* 注册一个观察者
*
* @param observer
*/
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
/**
* 移除一个观察者
*
* @param observer
*/
@Override
public void removeObserver(Observer observer) {
if (observers.contains(observer)) {
observers.remove(observer);
}
}
/**
* 遍历所有的观察者,并进行通知
*/
@Override
public void notifyObservers() {
for (int i = 0; i <observers.size() ; i++) {
observers.get(i).update(this.temperature,this.pressure,this.humidity);
}
}
}
package com.observer.improve;
//观察者接口,由观察者来实现
public interface Observer {
public void update(float temperature,float pressure,float humidity);
}
package com.observer.improve;
/**
* 显示当前天气情况(可以理解成是气象局自己的网站需要展示天气情况【当然还有百度、新浪等网站也需要展现天气情况】)
*/
public class CurrentConditions implements Observer{
private float temperature;//温度
private float pressure;//气压
private float humidity;//湿度
//更新天气情况,是由WeatherData类来调用,使用推送模式
public void update(float temperature,float pressure,float humidity){
this.temperature=temperature;
this.pressure=pressure;
this.humidity=humidity;
//更新完成之后,进行展示
display();
}
//显示
private void display() {
System.out.println("today temperature:"+temperature);
System.out.println("today pressure:"+pressure);
System.out.println("today humidity:"+humidity);
}
}
package com.observer.improve;
/**
* 百度网站
* 显示当前天气情况(可以理解成是气象局自己的网站需要展示天气情况【当然还有百度、新浪等网站也需要展现天气情况】)
*/
public class BaiduCurrentConditions implements Observer{
private float temperature;//温度
private float pressure;//气压
private float humidity;//湿度
//更新天气情况,是由WeatherData类来调用,使用推送模式
public void update(float temperature,float pressure,float humidity){
this.temperature=temperature;
this.pressure=pressure;
this.humidity=humidity;
//更新完成之后,进行展示
display();
}
//显示
private void display() {
System.out.println("百度首页气象信息");
System.out.println("baidu today temperature:"+temperature);
System.out.println("baidu today pressure:"+pressure);
System.out.println("baidu today humidity:"+humidity);
}
}
package com.observer.improve;
public class Client {
public static void main(String[] args) {
//创建一个weatherdata
WeatherData weatherData = new WeatherData();
//创建一个观察者
CurrentConditions currentConditions = new CurrentConditions();
BaiduCurrentConditions baiduCurrentConditions = new BaiduCurrentConditions();
//将观察者注册到weatherdata中
weatherData.registerObserver(currentConditions);
weatherData.registerObserver(baiduCurrentConditions);
//测试
System.out.println("通知各个注册的观察者,看看收到的信息");
weatherData.setData(10,100,32);
weatherData.removeObserver(currentConditions);
System.out.println("通知各个注册的观察者,看看收到的信息");
weatherData.setData(10,100,32);
}
}
运行结果:
通知各个注册的观察者,看看收到的信息 today temperature:10.0 today pressure:100.0 today humidity:32.0 百度首页气象信息 baidu today temperature:10.0 baidu today pressure:100.0 baidu today humidity:32.0 通知各个注册的观察者,看看收到的信息 百度首页气象信息 baidu today temperature:10.0 baidu today pressure:100.0 baidu today humidity:32.0

原文:https://www.cnblogs.com/dongyaotou/p/15237947.html