观察者模式
定义:对象之间一对多的关系,并且这一个对象产生改变时,其他观察者获取最新的消息
两个接口:
- Subject(任务中心接口)
- Observer(观察者接口)
subject:
//接口,让weatherDate来实现
//相当于任务中心
public interface Subject {
public void resgisterObserver(Observer o);//注册
public void removeObserver(Observer o);//移除
public void notifyObserver();//更新通知
}
Observer:
//观察者接口,由观察者来实现
public interface Observer {
public void update(float temperature,float pressure,float humidity);//更新update消息
}
Weather(信息处理核心类)
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
notifyObserver();
}
//当数据有更新时,就调用setDate
public void setData(Float temperature, float pressure, float humidity) {
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
//调用dataChange,将最新的信息 推送给 接入方 currentConditions
dataChange();
}
//注册一个观察者
@Override
public void resgisterObserver(Observer o) {
observers.add(o);
}
//移除一个观察者
@Override
public void removeObserver(Observer o) {
if (observers.contains(o)) {
observers.remove(o);
}
}
//通知(遍历所有的观察者,遍历)
@Override
public void notifyObserver() {
for (int i = 0; i < observers.size(); i++) {
observers.get(i).update(this.temperature, this.pressure, this.humidity);
}
}
}
观察者Observer1:
public class CurrentConditions implements Observer{
//温度,气压,湿度
private float temperature;
private float pressure;
private float humidity;
public void update(float temperature, float pressure, float humidity) {
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
display();
}
//显示
public void display(){
System.out.println("========================");
System.out.println("| 温度是: " +temperature);
System.out.println("| 气压是: " +pressure);
System.out.println("| 湿度是: " +humidity);
System.out.println("========================");
System.out.println();
}
}
观察者Observer2:
public class BaiduSite implements Observer{
//温度,气压,湿度
private float temperature;
private float pressure;
private float humidity;
public void update(float temperature, float pressure, float humidity) {
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
display();
}
//显示
public void display(){
System.out.println("========百度网站==========");
System.out.println("| 温度是: " +temperature);
System.out.println("| 气压是: " +pressure);
System.out.println("| 湿度是: " +humidity);
System.out.println("========================");
System.out.println();
}
}
测试类(Main):
public class Client {
public static void main(String[] args) {
//创建一个Weather Data
WeatherData weatherData = new WeatherData();
//创建观察者
CurrentConditions currentConditions = new CurrentConditions();
BaiduSite baiduSite = new BaiduSite();
//注册到weather
weatherData.resgisterObserver(currentConditions);
weatherData.resgisterObserver(baiduSite);
//测试
System.out.println("通知各个注册的观察者");
weatherData.setData(10f,155f,30.3f);
}
}
结果: