Head First设计模式:观察者模式

来源:互联网 发布:魔兽世界画面优化 编辑:程序博客网 时间:2024/05/10 03:20

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

例子:

package com.zoey.allTest.pattern.headFirst.observerPattern.book;public interface Subject {    public void registerObserver(Observer o);    public void deleteObserver(Observer o);    public void notifyObservers();//当主题状态改变时,这个方法被调用,通知所有观察者}
package com.zoey.allTest.pattern.headFirst.observerPattern.book;public interface Observer {    public void update(float temp, float humidity, float pressure);}
package com.zoey.allTest.pattern.headFirst.observerPattern.book;public interface DisplayElement {    public void display();}
package com.zoey.allTest.pattern.headFirst.observerPattern.book;public class CurrentConditionsDisplay implements Observer, DisplayElement {    private float temp;    private float humidity;    @SuppressWarnings("unused")    private Subject weatherData;    public CurrentConditionsDisplay(Subject weatherData) {        this.weatherData = weatherData;        weatherData.registerObserver(this);    }    public void update(float temp, float humidity, float pressure) {        this.temp = temp;        this.humidity = humidity;        display();    }    public void display() {        System.out.println(temp + " " + humidity);    }}
package com.zoey.allTest.pattern.headFirst.observerPattern.book;import java.util.ArrayList;public class WeatherData implements Subject {    @SuppressWarnings("rawtypes")    private ArrayList observers;    private float temp;    private float humidity;    private float pressure;    @SuppressWarnings("rawtypes")    public WeatherData() {        observers = new ArrayList();    }    @SuppressWarnings("unchecked")    public void registerObserver(Observer o) {        observers.add(o);    }    public void deleteObserver(Observer o) {        int i = observers.indexOf(o);        if ( i <= 0) {            observers.remove(i);        }    }    public void notifyObservers() {        for (int i = 0; i < observers.size(); i ++) {            Observer o = (Observer) observers.get(i);            o.update(temp, humidity, pressure);        }    }    public void measurementsChanged() {        notifyObservers();    }    public void setMeasurements(float temp, float humidity, float pressure) {        this.temp = temp;        this.humidity = humidity;        this.pressure = pressure;        measurementsChanged();    }}
package com.zoey.allTest.pattern.headFirst.observerPattern.book;public class WeatherDataTest {    public static void main(String[] args) {        WeatherData w = new WeatherData();        new CurrentConditionsDisplay(w);        w.setMeasurements(45, 52, 33f);    }}