设计模式-观察者模式

1.传统方式

使用场景:

  • 气象站每天会播报气温,湿度,气压等以公告。
  • 设计API 第三方去获取气象站的信息。
  • 提供 温度,湿度,气压等接口。
  • 测量数据更新时,能实时的通知对放。

传统设计方案

  • 通过对气象站项目的分析,设计出一个weatherData 类
    如下图:
  • 1).通过getxxx 可以让第三方接入,并得到相应的信息。
  • 2)当数据有更新时用dataChange() 来实时的更新数据,当第三方再次获取时,就能得到更新的数据。当然也可以推动。

在这里插入图片描述

currentCondtions (当天天气情况)可以理解为是我们气象局的网站//推送 如下类图: WeatherData 引用了 currentConditions 类

在这里插入图片描述

代码实现后续补充
缺点:

  • 1 无法动态的添加气象的网站(启动后)
  • 2 违反ocp原则,(在weatherData中,当增加一个第三方,都需要创建一个公告的模板,并加入到datachange,不利于维护,也不利于加入
    造成其他网站获取数据问题。
    “”

public void dataChange() { currentConditions.update(getTemperature(), getPressure(), getHumidity()); }

2. 观察者模式

  • 1.观察者模式类似定牛奶业务。
  • 2.奶站/气象局 :subject。
  • 3 用户第三方网站: observer 。
    subject 登记注册,移除通知
    observer 接收输入
    观察者模式:对象之间多对一依赖的一种设计方案,被依赖对象为subject,依赖的对象Observer ,Subject 通知Observer变化 比如subject是一的一方。用户Observer 是多的一方。(事件触发机制)

2.1 观察者模式原理图

在这里插入图片描述

2.2 补充的类图:

在这里插入图片描述

  • 显示属性和方法的类图,subject 类似 时间监听器,注册和删除相应事件,当有事件发生的时候,会广播的形式发给,observer 接口的实现类。

在这里插入图片描述

2.3 相应的代码

package design.observer;

/**
* @ClassName Subject
* @Description
* @Author
* @Date2022/1/7 22:28
* @Version V1.0
**/
public interface Subject {
   /**
    *  注册 第三方网站
    * @param observer
    */
   public  void registerObserver (Observer observer);

   /**
    * 删除第三方网站
    * @param observer
    */
   public  void  removeObserver (Observer observer);

   /**
    * 通知 所有网站
    */
   public  void notifyAllObservers();
}

package design.observer;

/**
 * @ClassName Observer
 * @Description
 * @Author
 * @Date2022/1/7 22:24
 * @Version V1.0
 **/
public interface Observer {
    /**
     *   .天气网站抽象的方法
     * @param temperature
     * @param pressure
     * @param humidity
     */
     void update (float temperature,float pressure, float humidity);
}

package design.observer;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName WeatherData
 * @Description
 * @Author
 * @Date2022/1/7 22:31
 * @Version V1.0
 **/
public class WeatherData implements Subject {
    private float temperature;
    private float pressure;
    private float humidity;

    private  List<Observer> observerList ;

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

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

    @Override
    public void registerObserver(Observer observer) {
        this.observerList.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
      if(this.observerList.contains(observer)){
         this.observerList.remove(observer);
      }
    }

    /**
     * 更新数据
     */
    public  void dataChanged(){
       notifyAllObservers();
    }

    @Override
    public void notifyAllObservers() {
     //遍历更新多个模板
        for(int i=0;i< this.observerList.size();i++){
            observerList.get(i).update(this.temperature,this.pressure,this.humidity);
        }
    }
}

package design.observer;

/**
 * @ClassName CurrentConditions
 * @Description
 * @Author
 * @Date2022/1/7 23:26
 * @Version V1.0
 **/
public class CurrentConditions  implements  Observer{
    private  float temperature;
    private  float  pressure;
    private  float  humidity;

    @Override
    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("temperature"+ temperature);
        System.out.println("pressure"+ pressure);
        System.out.println("humidity"+ humidity);

    }
}

package design.observer;

/**
 * @ClassName Client
 * @Description
 * @Author
 * @Date2022/1/7 23:31
 * @Version V1.0
 **/
public class Client {
    public static void main(String[] args) {
        WeatherData  weatherData= new WeatherData();
        CurrentConditions currentConditions=   new CurrentConditions();
        weatherData.registerObserver(currentConditions);
         weatherData.setData(10f,12f,13f);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

利剑 -~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值