二十、观察者模式

一、需求

在这里插入图片描述


二、观察者模式工作原理 + 类图设计

当subject中的数据发生改变时,会通知所有的obervers;
实际上就是subject 维护了一个oberver的list,observer可以动态的加入subject的list,或者是从中移除
在这里插入图片描述
在这里插入图片描述


三、观察者模式实现上述需求

/**
 * @author houChen
 * @date 2022/6/19 21:51
 * @Description: 
 */
public interface Subject {

    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObservers();

}


/**
 * @Description: 
 * 1、包含最新的天气情况信息
 * 2、 拥有观察者集合,使用ArrayList 进行管理
 * 3、当数据有更新时,就通知所有的接入方最新的消息
 */
public class WeatherData implements Subject {
    private float temperatrue;
    private float pressure;
    private float humidity;
    //观察者集合
    private ArrayList<Observer> observers;

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

    public float getTemperature() {
        return temperatrue;
    }

    public float getPressure() {
        return pressure;
    }

    public float getHumidity() {
        return humidity;
    }

    public void setData(float temperature, float pressure, float humidity) {
        this.temperatrue = temperature;
        this.pressure = pressure;
        this.humidity = humidity;
        this.notifyObservers();
    }

    //注册一个观察者
    @Override
    public void registerObserver(Observer o) {
        this.observers.add(o);
    }

    //移除一个观察者
    @Override
    public void removeObserver(Observer o) {
        if (this.observers.contains(o)) {
            this.observers.remove(o);
        }
    }

    //遍历所有的观察者,并进行通知
    @Override
    public void notifyObservers() {
        for (int i = 0; i < this.observers.size(); i++) {
            this.observers.get(i).update(this.temperatrue, this.pressure, this.humidity);
        }
    }
}


/**
 * @author houChen
 * @date 2022/6/19 21:55
 * @Description:  观察者接口
 */
public interface Observer {

    public void update(float temperature,float pressure,float humidity);

}


/**
 * @author houChen
 * @date 2022/6/19 21:58
 * @Description:  具体观察者
 */
public class CurrentCondition implements Observer {

    // 温度,气压,湿度
    private float temperature;
    private float pressure;
    private float humidity;

    //更新 天气情况,是由 WeatherData 来调用,我使用推送模式
    public void update(float temperature, float pressure, float humidity) {
        this.temperature = temperature;
        this.pressure = pressure;
        this.humidity = humidity;
        display();
    }

    //显示
    public void display() {
        System.out.println("***Today mTemperature: " + temperature + "***");
        System.out.println("***Today mPressure: " + pressure + "***");
        System.out.println("***Today mHumidity: " + humidity + "***");
    }
}


/**
 * @author houChen
 * @date 2022/6/19 22:14
 * @Description:
 */
public class Client {
    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();
        //创建一个观察者
        CurrentCondition currentCondition = new CurrentCondition();
        //注册观察者
        weatherData.registerObserver(currentCondition);
        weatherData.setData(10, 100, 30.3f);
    }
}

四、观察者模式好处

  • 观察者模式设计后,会以集合的方式来管理用户(Observer),包括注册移除和通知
  • 这样,我们在增加观察者时,就不需要修改核心类WeatherData,

JDK源码: Observale 类就运用了观察者模式

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值