设计模式——观察者模式

定义

定义对象见的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并且自动更新。

使用场景

一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两个方面封装在独立 的对象中使它们可以各自独立地改变和复用。
一个对象的改变将导致一个或多个其他对象也发生改变,而并不知道具体有多少对象将发生改变,也不知道这些对象是谁。
需要在系统中创建一个触发链,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;
    }
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值