java设计模式之观察者模式

来源:互联网 发布:人工智能 被黑客攻击 编辑:程序博客网 时间:2024/05/18 00:06

观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

观察者模式类图如下:
观察者模式类图
气象监测应用实例:
此系统中的三个部分是气象站(获取实际气象数据的物理装置)、WeatherData对象(追踪来自气象站的数据,并更新布告板)和布告板(显示目前天气状况给用户看)。

类图如下:
气象监测应用实例

Subject接口代码实现:

package com.weather;public interface Subject {    public void registerObserver(Observer o);    public void removeObserver(Observer o);    public void notifyObserver();}

Observer接口代码实现:

package com.weather;public interface Observer {    public void update(float tempture,float humidity,float pressure);}

DisplayElement接口代码实现:

package com.weather;public interface DisplayElement {    public void display();}

WeatherData类代码实现:

package com.weather;import java.util.ArrayList;public class WeatherData implements Subject{    private ArrayList<Observer> observers;    private float temperature;    private float humidity;    private float pressure;    public WeatherData(){        observers = new ArrayList<Observer>();    }    public void registerObserver(Observer o) {        // TODO Auto-generated method stub        observers.add(o);    }    public void removeObserver(Observer o) {        // TODO Auto-generated method stub        int i = observers.indexOf(o);        if (i >= 0) {            observers.remove(i);        }    }    public void notifyObserver() {        // TODO Auto-generated method stub        for (int i = 0; i < observers.size(); i++) {            Observer observer = (Observer)observers.get(i);            observer.update(temperature, humidity, pressure);        }    }    public void measurementsChanged(){        notifyObserver();    }    public void setmeasureMents(float temperature,float huminity,float pressure){        this.temperature = temperature;        this.humidity = huminity;        this.pressure = pressure;        measurementsChanged();    }}

CurrentConditionsDisplay类代码实现:

package com.weather;public class CurrentConditionsDisplay implements Observer,DisplayElement{    private float temperature;    private float humidity;    private float pressure;    private Subject weatherData;    public CurrentConditionsDisplay(Subject weatherData){        this.weatherData = weatherData;        weatherData.registerObserver(this);    }    public void display() {        // TODO Auto-generated method stub        System.out.println("current        tempeture:"+temperature+",current humidity:"+humidity                +",current pressure:"+pressure);    }    public void update(float tempture, float humidity, float pressure) {        // TODO Auto-generated method stub        this.temperature = tempture;        this.humidity = humidity;        this.pressure = pressure;        display();    }}

WeatherStation实例代码实现:

package com.weather;public class WeatherStation {    public static void main(String[] args){        WeatherData weatherData = new WeatherData();        CurrentConditionsDisplay currentConditionsDisplay =                 new CurrentConditionsDisplay(weatherData);        weatherData.setmeasureMents(38, 65, 32.1f);    }}

运行结果:

current tempeture:38.0,current humidity:65.0,current pressure:32.1
0 0
原创粉丝点击