前言
代码来源于生活,更加高于生活。设计模式让我们的生活更加的方便。观测一个东西,盯着一个东西,关注一个公众号,这些东西,如果没有即时通知的话,我们又特别想了解这方面的内容,那么我们除了一直耗着时间找人看着,可能没有更好的方法了,观察者模式的思想就是本人不用亲自盯着变化,当这些东西变化了,会通知本人了解情况。下面采用Observer Pattern进行实现。
内容
精华:
定义了对象直接的一对多依赖,这样一来,当一个对象改变转变状态时,它的所有依赖者都会收到通知并自动更新。
原则:
为交互对象之间的松耦合设计而努力。松耦合设计更有弹性,更能应付变化。
UML图部分:
DEMO部分:
说明:左半部分接口和一个类,分别定义了流程中用到的方法,注册、更新、通知、删除等,具体类做了具体的实现。
<span style="font-family:KaiTi_GB2312;font-size:18px;">/* * author:zhoulitong */ interface Subject { public void registerObserver(Observer o);//注册一个观察者 public void removeObserver(Observer o);//移除一个观察者 public void notifyObservers();//通知观察者 } //weatherdata现在实现了subject接口 class WeatherData implements Subject{ private ArrayList observers; private float temperature; private float humidity; private float pressure; public WeatherData(){ observers = new ArrayList(); } //注册观察者 public void registerObserver (Observer o){ observers.add(o);//此处定义observes为泛型类型,这种类型本身有增加删除方法; } //删除观察者 public void removeObserver(Observer o){ int i = observers.indexOf(o);//定义i为观察者的下标号 //如果存在观察者,就执行删除的方法 if(i>=0){ observers.remove(i); } } //具体通知观察者内容 public void notifyObservers(){ //i为一群观察者的每一个观察者 for(int i = 0; i < observers.size();i++){ Observer observer = (Observer)observers.get(i); observer.update(temperature, humidity,pressure); } } //通知观察者 public void measurementsChanged(){ notifyObservers(); } //设定数据,并提示更新了数据 public void setMeasurements(float temperature, float humidity, float perssure){ this.temperature = temperature; this.humidity = humidity; this.pressure = perssure; measurementsChanged(); } }</span>
说明:右半部分功能为接受通知后要更新数据和显示数据。
<span style="font-family:KaiTi_GB2312;font-size:18px;">interface Observer{ public void update(float temp, float humidity, float pressure); } interface DisplayElement{ public void display(); } //此布告板实现了Observer接口,所以可以从WeatherData对象中获得改变 class CurrentConditionsDisplay implements Observer,DisplayElement{ private float temperature; private float humidity; private Subject weatherData; public CurrentConditionsDisplay(Subject weatherData){ this.weatherData = weatherData; weatherData.registerObserver(this); } public void update(float temperature, float humidity, float pressure){ this.temperature = temperature; this.humidity = humidity; display(); } public void display(){ System.out.println("Current conditions: "+ temperature + "F degrees and " + humidity + "% humidity"); } }</span>
客户端:实例化一个weatherData对象和多个观察者对象,进行注册
<span style="font-family:KaiTi_GB2312;font-size:18px;">public class WeatherStation{ public static void main(String[] args){ WeatherData weatherData = new WeatherData(); CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData); weatherData.setMeasurements(80, 65, 30.4f); } }</span>
小结
在java中util里面有JDK自带的观察者Observer包,采用java自带的观察者也可以达到相同的功能,实现接口的时候,实现不同的更新方法就可以了。
感谢您的宝贵时间···