【设计模式】观察者模式

来源:互联网 发布:ipad软件删不掉怎么办 编辑:程序博客网 时间:2024/06/07 08:08

今天看了一下设计模式中的观察者模式,理解的不算太深但是把例子写了一下,还算有些收获吧。


简介:观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。

用大白话来说就是:你们都关注我,我给你们发送通知,【你们<=>观察者】【发通知人<=>主题】


举例子一个生活中的例子来说:

就类似订阅报纸,你订阅一家报社的报纸,【报社就是主题、你本人就是观察者】当报社有新的报纸会发送给订阅者。等价过来观察者模式就是,当主题信息改变或者更新后,会为观察者发送最先信息,观察者获取最新的信息。


例子:气象站

描述:此例子中的三个部分是气象站(获取实际气象数据的物理装置)、WeatherData对象【相当于报社的意义】(追踪来自气象站的数据,并更新布告板)和 布告板【相当于订阅者的意义】可以有很多很多个(显示目前天气状况给用户看)。



接口3个(Observer、Subject、DisplayElement

主题类1个(WeatherData)

观察者类3个(StatisticsDisplay、ForecastDisplay、CurrentConditionDisplay)

主类1个(WeatherStation)

下面给张图片屡屡思路【pdf图片太模糊了,自己就拍了一个】



1、接口类文件

//主题需要实现的接口public interface Subject {public void registerObserver(Observer o);public void removeObserver(Observer o);public void notifyObservers();}//观察者需要实现的接口1public interface Observer {public void update(float temp,float humidity,float pressure);}//观察者需要实现的接口2public interface DisplayElement {public void display();}


2、3个布告板类(StatisticsDisplay.java、ForecastDisplay.java、CurrentConditionDisplay.java

public class CurrentConditionDisplay implements Observer,DisplayElement{private float temperature;private float humidity;private Subject weatherData;public CurrentConditionDisplay(Subject weatherData) {this.weatherData = weatherData;weatherData.registerObserver(this);}public void update(float temp, float humidity, float pressure) {this.temperature =  temp;this.humidity = humidity;display();}public void display() {System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "%humidity");}}public class ForecastDisplay implements Observer,DisplayElement{private float temperature;private float humidity;private Subject weatherData;public ForecastDisplay(Subject weatherData) {this.weatherData = weatherData;weatherData.registerObserver(this);}public void update(float temp, float humidity, float pressure) {this.temperature =  temp;this.humidity = humidity;display();}public void display() {System.out.println("ForecastDisplay: " + temperature + "F degrees and " + humidity + "%humidity");}}public class StatisticsDisplay implements Observer,DisplayElement{private float temperature;private float humidity;private Subject weatherData;public StatisticsDisplay(Subject weatherData) {this.weatherData = weatherData;weatherData.registerObserver(this);}public void update(float temp, float humidity, float pressure) {this.temperature =  temp;this.humidity = humidity;display();}public void display() {System.out.println("StatisticsDisplay: " + temperature + "F degrees and " + humidity + "%humidity");}}



3、主题类文件

import java.util.ArrayList;public class WeatherData implements Subject{private ArrayList observeres;private float temperature;private float humidity;private float pressure;public WeatherData() {observeres = new ArrayList();}public void registerObserver(Observer o) {observeres.add(o);}public void removeObserver(Observer o) {int i = observeres.indexOf(o);if(i>0){observeres.remove(i);}}public void notifyObservers() {for (int i = 0; i < observeres.size(); i++) {Observer observer = (Observer)observeres.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();}}


4、主类

import java.io.StreamTokenizer;public class WeatherStation {public static void main(String[] args) {WeatherData weatherData = new WeatherData();CurrentConditionDisplay currentDisplay = new CurrentConditionDisplay(weatherData);StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData);weatherData.setMeasurements(80, 65, 30.4f);weatherData.setMeasurements(40, 65, 30.4f);}}

最后运行结果:



0 0
原创粉丝点击