观察者模式

package b_Observer;

public class CurrentConditionsDisplay implements Observer, DisplayElement {
private float temperature;
private float humidity;
private Subject weatherData;//取消注册时有这个引用会好很多

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

public void display() {
    System.out.println(temperature + " " + humidity);
}

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

}
package b_Observer;

public class StatisticsDisplay implements Observer, DisplayElement {
private float temperature;
private float pressure;
private Subject weatherData;// 取消注册时有这个引用会好很多

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

public void display() {
    System.out.println(temperature + " " + pressure);
}

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

}
package b_Observer;

public interface Subject {
// 注册观察者
void registerObserver(Observer o);

// 删除观察者
void removeObserver(Observer o);

// 通知观察者
void notifyObserver();

}

/**
* 所有的观察者必须实现update(),当气象值观测值改变时,主题会把这些状态值当做方法参数,传送给观察者
*/
interface Observer {

void update(float temp, float humidity, float pressure);

}

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

package b_Observer;

import java.util.ArrayList;

public class WeatherData implements Subject {
private ArrayList observers;
private float temperature;
private float humidity;
private float pressure;

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

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

@Override
public void removeObserver(Observer o) {
    int i = observers.indexOf(o);
    if (i >= 0)
        observers.remove(i);
}

@Override
public void notifyObserver() {
    for (int i = observers.size() - 1; i >= 0; i--) {
        Observer observer = observers.get(i);
        observer.update(temperature, humidity, pressure);
    }
}

// 当从气象站获得数据,通知观察者
public void measurementsChanged() {
    notifyObserver();
}

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

}
package b_Observer;

/**
* 观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖都会收到通知并自动更新 (MVC)
* 设计原则:为了交互对象之间的松耦合设计努力
* 出版者+订阅者=观察者模式 设计原则:低耦合,高内聚
*
* 对于每一个设计原则,请描述观察者模式如何遵循此原则。
* 设计原则:找出程序中会变化的方面,然后将其和固定不变的方面相分离。
* 在观察者模式中,会改变的是主题的状态,以及观察者的数目和类型。用这个模式,你可以改变依赖于主题状态的对象,却不必改变主题。这就叫提前规划!
* 设计原则:针对接口编程,不针对实现编程。
* 主题与观察者都使用接口:观察者利用主题的接口向主题注册,而主题利用观察者接口通知观察者。这样可以让两者之间运作正常,又同时具有松耦合的优点。
* 设计原则:多用组合,少用继承。
* 观察者模式利用“组合”将许多观察者组合进主题中。对象之间的这种关系不是通过继承产生的,而是在运行时利用组合的方式而产生的。
*/
public class WeatherStation {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();

    // 2个布告板(观察者)
    CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(
            weatherData);
    StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);

    weatherData.setMeasurements(80, 65, 10);
    weatherData.setMeasurements(80, 62, 10);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值