观察者模式
介绍说明
观察者模式是对象之间多对一依赖的一种设计方案,被依赖的对象成为Subject,依赖的对象为Observer,当Subject发生变化的时候可以通知到Observer。
类图说明
以天气预报为示例类图如下:
- Weather为核心类,实现了Subject里面的方法
- Subject有变化的时候,Observer会直接接收到通知
示例说明
/**
* 订阅接口
*/
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
核心类
public class WeatherData implements Subject {
private float temperatrue;
private float pressure;
private float humidity;
private ArrayList<Observer> observers;
public WeatherData() {
observers = new ArrayList<Observer>();
}
public float getTemperature() {
return temperatrue;
}
public float getPressure() {
return pressure;
}
public float getHumidity() {
return humidity;
}
public void dataChange() {
notifyObservers();
}
public void setData(float temperature, float pressure, float humidity) {
this.temperatrue = temperature;
this.pressure = pressure;
this.humidity = humidity;
dataChange();
}
public void registerObserver(Observer o) {
// TODO Auto-generated method stub
observers.add(o);
}
public void removeObserver(Observer o) {
// TODO Auto-generated method stub
if(observers.contains(o)) {
observers.remove(o);
}
}
public void notifyObservers() {
for(int i = 0; i < observers.size(); i++) {
observers.get(i).update(this.temperatrue, this.pressure, this.humidity);
}
}
}
观察者接口
public interface Observer {
public void update(float temperature, float pressure, float humidity);
}
实体对象类
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("***Today mTemperature: " + temperature + "***");
System.out.println("***Today mPressure: " + pressure + "***");
System.out.println("***Today mHumidity: " + humidity + "***");
}
}
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("====BaiduSite===");
System.out.println("BaiduSite: " + temperature + "***");
System.out.println("BaiduSite: " + pressure + "***");
System.out.println("BaiduSite: " + humidity + "***");
}
}
测试实例
public class Test{
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditions currentConditions = new CurrentConditions();
BaiduSite baiduSite = new BaiduSite();
weatherData.registerObserver(currentConditions);
weatherData.registerObserver(baiduSite);
System.out.println("当前数据1");
weatherData.setData(10f, 100f, 30.3f);
weatherData.removeObserver(currentConditions);
System.out.println("= ======================");
System.out.println("当前数据2");
weatherData.setData(10f, 100f, 30.3f);
}
}
总结
观察者模式是一种比较简单的设计模式,主要解决的是依赖关系是多对一的情况。