观察者模式

 观察者模式定义了对象之间的一对多依赖,这样当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
 观察者模式中主题与观察者之间的关系:观察者依赖于主题,只要主题状态发生改变,就会通知观察者,因此定义了如下类图。
这里写图片描述
 设计了一个主题接口、一个观察者接口和两个对应的实体类:
1. interface subject:主题接口,主要负责通知观察者更新数据、添加观察者和删除观察者。
2. interface Observer:观察者接口,主要负责更新观察者所观测的数据。
3. class ConcreteSubject:主题实体,主要实现主题接口中的接口方法和观察数据的产生。
4. class ConcreteObserver:观察者实体,主要实现观察数据的处理以及更新方法。
 从上述类图可见,主题不需要知道观察者的设计与实现,只需要通过Observer对象传递数据,而相似的,观察者只需要从Observer对象中取出数据即可,实现了主题与观察者之间的松耦合。当有新的观察者时,只需要通过subject接口添加。观察者的数据更新是通过主题实体的Notify方法调用了update方法,实现了IOC。

Demo如下:
 使用java内置的观察者模式,WeatherData实现了Observer被观察者,CurrentConditionsDisplay实现了Observable观察者,当WeatherData数据改变时,则通知CurrentConditionDisplay,提示其更新数据。

import java.util.Observable;
import java.util.Observer;

public class CurrentConditionsDisplay implements Observer, DispalyElement{
    Observable observable;
    private float temperature;
    private float humidity;

    public CurrentConditionsDisplay(Observable observable) {
        super();
        this.observable = observable;
        observable.addObserver(this);
    }

    @Override
    public void display() {
        // TODO Auto-generated method stub
        System.out.println("1:temp: " + temperature + " ,hum: " + humidity);
    }

    @Override
    public void update(Observable o, Object arg) {
        // TODO Auto-generated method stub
        if (o instanceof WeatherData) {
            WeatherData weatherData = (WeatherData) o;
            this.temperature = weatherData.getTemperature();
            this.humidity = weatherData.getHumidity();
            display();
        }
    }

}

WeatherData实现:

import java.util.Observable;

public class WeatherData extends Observable{
    private float temperature;
    private float humidity;
    private float pressure;

    public WeatherData(){}

    public void measurementsChanged(){
        setChanged();
        notifyObservers();
    }

    public void setMeasurements(float temperature, float humidity, float pressure){
        this.temperature = temperature;
        this.pressure = pressure;
        this.humidity = humidity;
        measurementsChanged();
    }

    public float getTemperature() {
        return temperature;
    }

    public float getHumidity() {
        return humidity;
    }

    public float getPressure() {
        return pressure;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值