【Java】Observer Pattern

来源:互联网 发布:数学竞赛知乎 编辑:程序博客网 时间:2024/05/21 13:10

前言

  代码来源于生活,更加高于生活。设计模式让我们的生活更加的方便。观测一个东西,盯着一个东西,关注一个公众号,这些东西,如果没有即时通知的话,我们又特别想了解这方面的内容,那么我们除了一直耗着时间找人看着,可能没有更好的方法了,观察者模式的思想就是本人不用亲自盯着变化,当这些东西变化了,会通知本人了解情况。下面采用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自带的观察者也可以达到相同的功能,实现接口的时候,实现不同的更新方法就可以了。


感谢您的宝贵时间···


0 1
原创粉丝点击