/*------观察者模式-------
* 1. 观察者模式定义了对象间的一对多依赖,
* 当一个对象改变状态时,他的所有依赖者(差异)都会收到通知并自动更新
* 2. 出版社与订报者的关系(主题与观察者)
*
* 3.Subject()为超接口,weatherData实现其:注册,删除,设置-改变-通知
* Observer:观察者接口:updata():更新提醒方法
* Current :观察者:实现Observer,在其构造方法里注册
*
* 4.观察者和可观察者之间用松耦合方式结合,可观察者不知道观察者的细节,
* 只知道观察者实现了观察者接口。
*
* 5.使用此模式时,你可从被观察者推(push)或拉(pull)数据(然而,推的方式被认为更“正确”)。
*
* 6.00原则:
* 1: 抽象
* 2.封装变化多用组合,少用继承
* 3.针对接口编程,不针对实现编程
* 4.为交互对象之间的松耦合设
*
* 1. 观察者模式定义了对象间的一对多依赖,
* 当一个对象改变状态时,他的所有依赖者(差异)都会收到通知并自动更新
* 2. 出版社与订报者的关系(主题与观察者)
*
* 3.Subject()为超接口,weatherData实现其:注册,删除,设置-改变-通知
* Observer:观察者接口:updata():更新提醒方法
* Current :观察者:实现Observer,在其构造方法里注册
*
* 4.观察者和可观察者之间用松耦合方式结合,可观察者不知道观察者的细节,
* 只知道观察者实现了观察者接口。
*
* 5.使用此模式时,你可从被观察者推(push)或拉(pull)数据(然而,推的方式被认为更“正确”)。
*
* 6.00原则:
* 1: 抽象
* 2.封装变化多用组合,少用继承
* 3.针对接口编程,不针对实现编程
* 4.为交互对象之间的松耦合设
*
* */
package com.xjj.observer;
//观察者接口:负责通知
public interface Observer {
public void updata(float temp, float hum, float pressure);
}
package com.xjj.observer;
//展现
public interface Display {
public void display();
}
package com.xjj.observer;
import java.util.ArrayList;
/* 当前天气情况,实现自观察者(负责更新),表现接口(负责表现)
* 相当于订报,需要完成注册等工作...
*
* */
class CurrentConditionDis implements Observer, Display {
private float pressure;
private float temperature;
private float humidity;
private Subject weatherData;
//构造方法--完成注册--保存sub引用,方便删除
public CurrentConditionDis(Subject weatherData) {
this.weatherData = weatherData;
weatherData.register(this); //注册
}
//负责更新数据,通知表现
@Override
public void updata(float temp, float hum, float pressure) {
this.temperature = temp;
this.humidity = hum;
this.pressure = pressure;
display();
}
@Override
public void display() {
System.out.println("Current: " + temperature
+ "F degree: " + humidity);
}
}
/* 天气数据主题:实现主题类,相当于报社(提供报纸)
* 有注册,注销,提醒通知等功能...
**/
class WeatherData implements Subject {
private ArrayList observers; //保存注册对象
private float temperature;
private float humidity;
private float pressure;
public WeatherData() {
observers = new ArrayList(); //构造函数初始化注册
}
@Override
public void register(Observer observer) {
observers.add(observer); //将其观察者(订报者),注册者加入
}
@Override
public void remove(Observer observer) {
int i = observers.indexOf(observer);
if (i >= 0) { //注销
observers.remove(i);
}
}
@Override
public void notifyObservers() {
//通知更新:将其向上转型,调用其对应对象更新
for(int i = 0; i < observers.size(); i++){
Observer observer = (Observer)observers.get(i);
observer.updata(temperature, humidity, pressure);
}
}
//如果改变则通知
public void measureChanged(){
notifyObservers();
}
//设置数据,更新改变数据,之后数据改变,通知更新
public void setMeasure(float temperature,float humidity,float pressure){
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measureChanged();
}
}
//天气情况
public class Main {
public static void main(String[] args){
WeatherData weatherData = new WeatherData();
//现在天气
CurrentConditionDis conditionDis = new CurrentConditionDis(weatherData);
weatherData.setMeasure(80, 55, 30.22f);
}
}