Head First设计模式笔记(观察者模式)

来源:互联网 发布:折线图数据单位不一样 编辑:程序博客网 时间:2024/06/06 01:30

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

package com.TWO;public interface Subject {    void registerObserver(Observer  o);    void removeObserver(Observer  o);    //当主题状态改变时,这个方法会被调用,以通知所有的观察者    void notifyObservers();}

观察者

package com.TWO;public interface Observer {    //当气象观察值改变时,主题会把这些状态值当做方法的参数,传给观察者    void update(float temp,float humidity,float pressure);}

展现接口

package com.TWO;public interface DisplayElement {    //当布告板需要显示时,调用此方法    void display();}

真正的主题 实现Subject接口

package com.TWO;import java.util.ArrayList;public class WeatherData implements Subject{    //用一个集合来记录观察者,在构造器中建立    private ArrayList observers;    private float temp;    private float humidity;    private float pressure;    public WeatherData(){        observers = new ArrayList();    }    //当注册观察者,把它加到Arraylist中    @Override    public void registerObserver(Observer  o) {        observers.add(o);    }    //当观察者想取消注册,我们把它从list中删除    @Override    public void removeObserver(Observer  o) {        int i = observers.indexOf(o);        if(i >= 0){            observers.remove(i);        }    }    @Override    public void notifyObservers() {        for(int i = 0;i< observers.size();i++){            Observer observer = (Observer)observers.get(i);            observer.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();    }    float getTemperature(){        return (float)0.0;    }    float getHumidity(){        return (float)0.0;    }    float getPressure(){        return (float) 0.0;    }}

接下来是几个观察者
1.

package com.TWO;public class CurrentConditionsDisplay implements Observer,DisplayElement{    private float temp;    private float humidity;    private Subject weatherData;    //构造器需要weatherData对象作为注册之用    public CurrentConditionsDisplay(Subject weatherData){        this.weatherData = weatherData;        weatherData.registerObserver(this);    }    @Override    public void update(float temp,float humidity,float pressure) {        this.temp = temp;        this.humidity = humidity;        display();    }    //显示当前观察值    @Override    public void display() {        System.out.println("temp = "+temp + ";humidity = "+ humidity);    }}

2.

package com.TWO;public class ForecastDisplay implements Observer,DisplayElement{    @Override    public void display() {        // TODO Auto-generated method stub    }    @Override    public void update(float temp,float humidity,float pressure) {        // TODO Auto-generated method stub    }}

3.

package com.TWO;public class StatisticsDisplay implements Observer,DisplayElement{    //显示最小,平均和最大的观察值    @Override    public void display() {        // TODO Auto-generated method stub    }    @Override    public void update(float temp,float humidity,float pressure) {        // TODO Auto-generated method stub    }}

4.

package com.TWO;public class ThirdPartyDisplay implements Observer,DisplayElement {    //显示基于观察值的其他内容    @Override    public void display() {        // TODO Auto-generated method stub    }    @Override    public void update(float temp,float humidity,float pressure) {        // TODO Auto-generated method stub    }}

后面几个我也没具体写
最后测试类

package com.TWO;public class Main {    public static void main(String[] args){        WeatherData weatherData = new WeatherData();        CurrentConditionsDisplay display = new CurrentConditionsDisplay(weatherData);        //模拟数据变化        weatherData.setMeasurements(30, 40, 50);    }}
原创粉丝点击