设计模式——观察者模式
一、定义
一种一对多的依赖关系,让多个观察者对想同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察这对象,是它们能够自动更新自己。
二、例子。
气象台对天气实时监控,只要天气的温度湿度等等一有变化就公告栏就更新数据。
UML图:
代码:
天气变化接口:
public interface Subject(){ public void registerObserver(Observer o);//添加公告栏 public void removeObserver(Observer o);//取消公告栏 public void notifyObservers();//通知公告栏更新 }
天气变化数据改变实现:
public class WeatherData implements Subject{ private ArrayList observers; private float temperature; private float humidity; private float pressure; //公告栏的模版 public WeatherData(){ observers= new ArrayList(); } //添加公告栏 public void registerOvserver(Observer o ){ observers.add(o); } //移除公告栏 public void removeObserver(Observer o){ int i=observers.indexOf(o); if(i>=0){ observers.remove(i); } } //通知公告栏更新的信息 public notifyObservers(){ for(int i=0;i<observers.size();i++){ Observer observer=(Observer)observer.get(i); observer.update(temperature,humidity,pressure); } } //公告栏更新 public void measurementsChanged(){ notifyObservers(); } //获得信息 public void setMeasurements(float temperature,float humidity,float pressure){ this.temperature=temperature; this.humidity=humidity; this.pressure=pressure; measurementsChanged(); } }
公告栏更新接口:
public interface Observer(){ public void update(float temp,float humidity,float pressure); }
公告栏显示接口:
public interface DisplayElement(){ public void display(); }
公告栏:
public class CurrentConditionsDisplay implements Observer,DisplayElements{ private float temperature; private float humidity; private Subject weatherData; //公告栏构造函数 public CurrentConditionsDisplay(Subject weatherData){ this.weatherData=weatherData; weatherData.registerOvserver(this); } //公告栏更新数据 public void update(float temperature,float humidity,float,float pressure){ this.temperature=temperature; this.humidity=humidity; display(); } public void display(){ System.out.println("Current conditions:"+ temperature+"F degress and "+humidity+"% humidity"); } }
客户端:
public class WeatherStation{ public static void main(String[] args){ WeatherData wetherData=new WeaterData(); CurrentConditionsDisplay currentDisplay(weaterData); weaterData.setMeasurements(80,65,30.4f); } }
综述:
观察者模式让双方都依赖于接口(或抽象),而不是依赖与具体,从而是的各自的变化都不会影响另一边的变化。公告板样式,显示数据的变化不会影响天气数据的变化。
Meet so Meet.
C plusplus
I-PLUS....