观察者模式
观察者模式(Observer Pattern)也叫发布-订阅(Publish/Subscribe)模式,是属于行为型模式。观察者模式定义了一种对象间多对一的依赖关系,使得当被观察者状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
观察者模式的四个角色
- Subject(抽象被观察者角色): 这是一个抽象类或接口,定义了对观察者集合的操作,例如注册观察者、删除观察者和通知更新观察者信息等。
- ConcreteSubject(具体被观察者角色): 具体观察者角色有自己的属性和方法,并实现了抽象被观察者的方法。它定义了一个观察者集合,通过一些方法对观察者和观察者集合进行操作。
- Observer(抽象观察者角色): 抽象观察者通常是一个抽象类或接口,它定义了一个更新方法,当被观察者状态改变时,通过此方法更新自己的状态。
- ConcreteObserver(具体观察者角色): 具体观察者实现了抽象观察者的方法,当被观察者状态发生改变,通过
update()
方法来更新自己的状态。
举一个栗子
假设有一个气象中心负责观察天气信息,有温度、气压和湿度等。然后有一些天气软件,通过使用气象中心提供的数据放到自己的软件中作为展示天气的功能,当气象中心的数据发生变化时,气象中心又把这些更新后的数据推动给这些应用软件,来更新各个软件中的天气数据。
Subject:抽象被观察者
这个接口定义了三个方法,方法的作用在注释用可以看到。
package cn.personalweb.observer;
public interface Subject {
/**
* 注册观察者, 将观察者添加到观察者集合里
* @param observer 观察者
*/
public void registerObserver(Observer observer);
/**
* 通过观察者对象, 从集合中删除此观察者
* @param observer 观察者
*/
public void removeObserver(Observer observer);
/**
* 通知在集合中的所有观察者
*/
public void notifyObservers();
}
Observer:抽象观察者
定义了一个update()
方法,用于更新自己的状态
package cn.personalweb.observer;
public interface Observer {
/**
* 更新观察者数据
* @param temperature 温度
* @param pressure 气压
* @param humidity 湿度
*/
public void update(float temperature, float pressure, float humidity);
}
WeatherData:具体被观察者
这里的被观察者是天气数据,观察者来观察天气数据。当天气数据发生改变是,也就是setData()
方法执行时,会调用notifyObservers()
方法来改变每一个观察者的数据,也就是将最新的数据修改到观察者。
package cn.personalweb.observer;
import java.util.ArrayList