观察者模式

一、定义

  对象之间定义一对多的依赖,当一个对象状态改变,依赖它的对象都会收到通知并作出相应的更新。

二、应用场景

  典型的就是杂志的订阅,rss订阅。我们订阅的一方就形成了对杂志社的依赖,只要杂志社有更新,而我们就对得到相应的通知

三、涉及的概念

  主题Subject(杂志社)

  观察者Observer(我们订阅的一方)

四、接口的定义

  对于杂志社(Subject)而言:

  1、可以添加一个订阅的人(Observer);registerObserver(Observer observer);

  2、如果不想订阅了,那杂志社可以吧相应订阅的人从名单上移除,那以后有新的杂志出来,不会再发送给那个人了;removeObserver(Observer observer)

  3、有新的杂志出来,那就要通知每个订阅的人;notifyObservers();

  对应的java类如下

/**
 * @ClassName   类  名   称:    Subject.java
 * @Description 功能描述:    主题
 * @author      创  建   者:    zhengQun    
 * @date        创建日期:    2013-11-21下午2:16:09
 */
public interface Subject {
    public void registerObserver(Observer observer);
    public void removeObserver(Observer observer);
    public void notifyObservers();
}

  对于我们订阅的一方(观察者):对于杂志的到来,我们可能会进行阅读,也有可能做收藏用。。。总的来说就是我们如何来应对主题的更新。对应的java类如下:

/**
 * @ClassName   类  名   称:    Observer.java
 * @Description 功能描述:    
 * @author      创  建   者:    zhengQun    
 * @date        创建日期:    2013-11-21下午2:27:30
 */
public interface Observer {
    public void update(float temperature,float humidity,float pressure);
}

五、具体的应用:

如果气象站温度、湿度、压力改变了,需要在对应的布告板上显示出来

/**
 * @ClassName   类  名   称:    WeatherData.java
 * @Description 功能描述:    
 * @author      创  建   者:    zhengQun    
 * @date        创建日期:    2013-11-21下午2:29:12
 */
public class WeatherData implements Subject{
    private List<Observer> observerList;
    private float temperature;
    private float humidity;
    private float pressure;
    
    public WeatherData() {
        observerList = new ArrayList<Observer>();
    }

    public WeatherData(List<Observer> observerList) {
        this.observerList = observerList;
    }

    public void registerObserver(Observer observer) {
        observerList.add(observer);
    }

    public void removeObserver(Observer observer) {
        if(observerList.indexOf(observer) != -1){
            observerList.remove(observer);
        }
    }

    public void notifyObservers() {
        for (Observer o : observerList) {
            o.update(temperature, humidity, pressure);
        }
    }
    
    public void mesurementsChanged(){
        notifyObservers();
    }
    
    public void setMesurements(float temperature,float humidity,float pressure){
        this.setTemperature(temperature);
        this.setHumidity(humidity);
        this.setPressure(pressure);
        mesurementsChanged();
    }

    public float getTemperature() {
        return temperature;
    }

    public void setTemperature(float temperature) {
        this.temperature = temperature;
    }

    public float getHumidity() {
        return humidity;
    }

    public void setHumidity(float humidity) {
        this.humidity = humidity;
    }

    public float getPressure() {
        return pressure;
    }

    public void setPressure(float pressure) {
        this.pressure = pressure;
    }
}

布告板:

/**
 * @ClassName   类  名   称:    CurrentConditionDisplay.java
 * @Description 功能描述:    
 * @author      创  建   者:    zhengQun    
 * @date        创建日期:    2013-11-21下午2:51:46
 */
public class CurrentConditionDisplay implements Observer,DisplayBehavior{
    private float temperature;
    private float humidity;
    
    private Subject weatherData;
    
    public CurrentConditionDisplay() {
    }

    public CurrentConditionDisplay(Subject weatherData) {
        this.weatherData = weatherData;
        weatherData.registerObserver(this);
    }

    public void display() {
        System.out.println("当前的状况:" + temperature + "℃," + humidity + "%湿度");
    }

    public void update(float temperature, float humidity, float pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        display();
    }
    
}

测试类:

/**
 * @ClassName   类  名   称:    Test.java
 * @Description 功能描述:    
 * @author      创  建   者:    zhengQun    
 * @date        创建日期:    2013-11-21下午3:06:18
 */
public class Test {
    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();
        CurrentConditionDisplay display = new CurrentConditionDisplay(weatherData);

        weatherData.setMesurements(12, 60, 14);
    }
}

 

 

  

 

posted on 2014-01-26 10:07  石头hah  阅读(215)  评论(0编辑  收藏  举报

导航