定义
定义对象见的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并且自动更新。
使用场景
一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两个方面封装在独立 的对象中使它们可以各自独立地改变和复用。
一个对象的改变将导致一个或多个其他对象也发生改变,而并不知道具体有多少对象将发生改变,也不知道这些对象是谁。
需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……, 可以使用观察者模式创建一种链式触发机制。
优点:
实现了观察者和目标之间的抽象耦合
实现了动态联动(一个操作会引起其它相关的操作)
支持广播通信
缺点:
互为观察者与被观察者间有循环依赖的话,要注意相互通知引起的死循环!
可能会引起武威操作,误更新。
代码实现
public interface Subject {
void registerObserver(Observer observer);
void removerObserver(Observer observer);
void notifyObservers();
}
//具体被观察者:天气
public class WeatherData implements Subject{
private double temperature;
private double pressure;
private double humidity;
private List<Observer> observers;
public WeatherData(){
observers = new ArrayList<>();
}
public void update(double temperature, double pressure, double humidity){
setData(temperature,pressure,humidity);
}
public void setData(double temperature, double pressure, double humidity){
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
notifyObservers();
}
//注册观察者
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removerObserver(Observer observer) {
if(observers.contains(observer))
observers.remove(observer);
}
//通知观察者
@Override
public void notifyObservers() {
for(Observer observer:observers)
observer.update(temperature,pressure,humidity);
}
}
public interface Observer {
void update(double temperature,double pressure, double humidity);
}
//具体观察者:当前天气
public class CurrentCondition implements Observer {
private double temperature;
private double pressure;
private double humidity;
//更新天气
@Override
public void update(double temperature, double pressure, double humidity) {
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
}
}