观察者模式

 

观察者模式


观察者模式中使用到两个类:

1.主题类:用于提供数据和数据变更实时提醒服务。

2.观察者类:获取到数据并使用数据。

以上两类均作为接口提供

package Observer;
/**
 * 主题:注册,取消注册,通知 观察者
 * @author TisaKong
 * 2015-6-5
 */
public interface Subject {

    public void registerObserver(Observer e);

    public void removeObserver(Observer e);

    public void notifyObserver();

}

package Observer;
/**
 * 观察者接口,更新来自Object的最新数据
 * @author TisaKong
 * 2015-6-5
 */
public interface Observer {
    public void update(float temp , float humidity , float pressure);
}

实例:

天气预报系统: “数据中心”用于提供实时的天气数据,每当有数据更新,及时通知“展示天气”的客户端更新数据

package Observer;
/**
 * 展示数据接口
 * @author TisaKong
 * 2015-6-5
 */
public interface DisplayElement {
    public void display();
}

数据中心:是一个实现Subject接口的类

package Observer;

import java.util.ArrayList;
import java.util.List;

/**
 * 天气预报 ,实现Subject接口
 * @author TisaKong
 * 2015-6-5
 * 提供天气数据的类(观察者模式中的主题类)
 * 成员:各种天气数据,以及一个列表,用于维护在此注册了的观察者们。
 * 功能:1.观察者注册;2.取消观察者的注册;3.天气数据变更时,更新天气数据;4.通知观察者们天气变更
 * 构造方法:初始化维护列表。
 */

public class WeatherData implements Subject {

    private List<Observer> observers;
    private float temp;
    private float humidity;
    private float pressure;

    public WeatherData() {
        observers = new ArrayList<Observer>();
    }

    @Override
    public void registerObserver(Observer e) {
        observers.add(e);
    }

    @Override
    public void removeObserver(Observer e) {
        if(observers.contains(e)){
            observers.remove(e);
        }
    }

    @Override
    public void notifyObserver() {
        for(Observer o:observers){
            o.update(temp, humidity, pressure);
        }
    }

    public void setWeatherData(float temp , float humidity , float pressure){
        this.temp = temp;
        this.humidity = humidity;
        this.pressure = pressure;
        notifyObserver();
    }


}

实时天气展示板:是一个实现Observer接口的类

package Observer;
/**
 * 实时天气展示板:实现了观察者接口,和显示元素接口
 * @author TisaKong
 * 2015-6-5
 * 用于展示实时天气数据的类(观察者模式中的观察者)
 * 成员:各种天气数据,主题(观察者模式中的主题类),用于通知该注册成为那个主题的观察者
 * 功能:1.更新天气数据(又主题对象在天气变更时调用,即观察者实时得到通知);2.展示天气数据(可以在控制台或者网页中输出天气数据)
 * 构造方法:获得一个主题对象,调用其方法,注册成为它的观察者
 */
public class CurrentConditionsDisplay implements Observer, DisplayElement {
    private float temp;
    private float humidity;
    private float pressure;
    private Subject sub;

    public CurrentConditionsDisplay(Subject sub) {
        this.sub = sub;
        sub.registerObserver(this);
    }


    @Override
    public void display() {
        System.out.println("currentCondition:"+"\n"+
                "tempratry:"+temp+"\n"+
                "humidity:"+humidity+"\n"+
                "pressure:"+pressure);
    }

    @Override
    public void update(float temp, float humidity, float pressure) {
        this.temp = temp;
        this.humidity = humidity;
        this.pressure = pressure;
    }


}

客户端测试:

package Observer;
/**
 * 观察者模式客户端
 * @author TisaKong
 * 2015-6-5
 */
public class WeatherStation {
    public static void main(String[] args) {
        WeatherData wd = new WeatherData();
        CurrentConditionsDisplay ccd = new CurrentConditionsDisplay(wd);
        ccd.display();
        System.out.println("--------------------华丽丽的分割线---------------------");
        wd.setWeatherData(121, 221, 111);
        ccd.display();
    }
}

 

posted @ 2015-06-05 12:48  克什米尔公子  阅读(94)  评论(0)    收藏  举报