demo描述:气象局实时更新天气状况,各个网站根据气象局发布的天气状况更新自己的天气状况,可能会有新的网站发布气象局更新的天气状况
demo代码:
管理需要气象局天气数据的类(观察者)的接口:
public interface Subject {
void registerObserver(Observer o);
void removeObserver(Observer o);
void nogifyObservers();
}
气象局更新天气数据:
public class WeatherData implements Subject {
//描述天气的属性
private float temperature;
private float pressure;
private float humidity;
public float getTemperature() {
return temperature;
}
public float getPressure() {
return pressure;
}
public float getHumidity() {
return humidity;
}
//观察者集合
private ArrayList<Observer> observers;
public WeatherData() {
observers = new ArrayList<Observer>();
}
//数据更新时调用
public void setDate(float temperature, float pressure, float humidity) {
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
dataChange();
}
public void dataChange() {
nogifyObservers();
}
//注册观察者
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
//删除观察者
@Override
public void removeObserver(Observer o) {
if (observers.contains(o)) {
observers.remove(o);
}
}
//通知观察者变化,让观察者进行对应的更新
@Override
public void nogifyObservers() {
for (int i = 0; i < observers.size(); i++) {
observers.get(i).update(this.temperature, this.pressure,
this.humidity);
}
}
}
观察者更新天气数据的接口:
public interface Observer {
void update(float temperature,float pressure,float humidity);
}
观察者们:
public class BaiduSite implements Observer {
private float temperature;
private float pressure;
private float humidity;
public void display() {
System.out.println("百度<<温度:" + temperature);
System.out.println("百度<<气压:" + pressure);
System.out.println("百度<<湿度:" + humidity);
}
@Override
public void update(float temperature, float pressure, float humidity) {
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
display();
}
}
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("官方<<温度:"+temperature);
System.out.println("官方<<气压:"+pressure);
System.out.println("官方<<湿度:"+humidity);
}
}
客户端:
public class Client {
public static void main(String[] args) {
//创建weahterdate
WeatherData weatherData = new WeatherData();
//创建观察者
CurrentConditions currentConditions = new CurrentConditions();
BaiduSite baiduSite = new BaiduSite();
//注册观察者
weatherData.registerObserver(currentConditions);
weatherData.registerObserver(baiduSite);
System.out.println("通知各个观察者");
weatherData.setDate(10, 100, 20);
}
}
demo类图:
类图分析:被观察者额外通过接口实现管理观察者、通知观察者更新数据的方法;观察者通过接口可实时get到被观察者的状况,观察者可扩展。两者通过接口配合起来共同完成发布-定阅这一功能体系
适用场景:发布-订阅模型、实时更新模型、类属性set:其他类get=1:多时适用
总结:观察者模式是一种对象间多对一的设计方案,观察者需要实时获得被观察者的变化,即被观察者变化时同时将变化同步到观察者。
这里的变化一般说的是属性值的变化