Java使用观察者模式实现气象局高温预警功能示例

 更新时间:2018年04月28日 11:52:25   作者:chengqiuming  
这篇文章主要介绍了Java使用观察者模式实现气象局高温预警功能,结合完整实例形式分析了java观察者模式实现气象局高温预警的相关接口定义、使用、功能操作技巧,并总结了其设计原则与适用场合,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了Java使用观察者模式实现气象局高温预警功能。分享给大家供大家参考,具体如下:

一、模式定义

观察者模式,又称为发布/订阅模式。观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

二、模式举例

1 模式分析

我们借用气象局高温预警来说明这一模式。

2 观察者模式静态类图

3 代码示例

3.1观察者接口一IObserver

package com.demo.observer;
import com.demo.subject.ISubject;
/**
 * 观察者接口
 * @author
 *
 */
public interface IObserver
{
  //更新方法
  public void update(ISubject subject);
}

3.2主题接口一ISubject

package com.demo.subject;
import com.demo.observer.IObserver;
/**
 * 主题接口(被观察者)
 *
 * @author
 *
 */
public interface ISubject
{
  /**
   * 增加观察者
   *
   * @param observer
   * @return
   */
  public boolean add(IObserver observer);
  /**
   * 删除观察者
   *
   * @param observer
   * @return
   */
  public boolean remove(IObserver observer);
  /**
   * 通知所有观察者更新数据
   */
  public void notifyAllObserver();
  /**
   * 设置温度值
   *
   * @param temperature
   */
  public void setTemperature(float temperature);
  /**
   * 获得温度预警
   *
   * @return
   */
  public String temperatureReport();
}

3.3具体主题实现一Subject

package com.demo.subject;
import java.util.Iterator;
import java.util.Vector;
import com.demo.observer.IObserver;
/**
 * 主题实现类(被观察者)
 *
 * @author
 *
 */
public class Subject implements ISubject {
  // 温度
  /**
   * (一)高温黄色预警信号
   *
   * 标准:连续三天日最高气温将在35℃以上。
   *
   * (二)高温橙色预警信号
   *
   * 标准:24小时内最高气温将升至37℃以上。
   *
   * (三)高温红色预警信号
   *
   * 标准:24小时内最高气温将升至40℃以上。
   */
  private float temperature;
  // 预警级别
  private String warningLevel;
  // 保存观察者列表
  private final Vector<IObserver> vector;
  /**
   * 构造方法 初始化观察者列表
   */
  public Subject() {
    vector = new Vector<IObserver>();
  }
  /**
   * 增加观察者
   */
  public boolean add(IObserver observer) {
    if (observer != null && !vector.contains(observer)) {
      return vector.add(observer);
    }
    return false;
  }
  /**
   * 移除观察者
   */
  public boolean remove(IObserver observer) {
    return vector.remove(observer);
  }
  /**
   * 通知所有观察者更新数据
   */
  public void notifyAllObserver() {
    System.out.println("======气象部门发布高温" + this.warningLevel + "警报!======");
    Iterator<IObserver> iterator = vector.iterator();
    while (iterator.hasNext()) {
      (iterator.next()).update(this);
    }
  }
  /**
   * 私有方法 根据温度值设置预警级别 然后通知所有观察者
   */
  private void invoke() {
    if (this.temperature >= 35) {
      if (this.temperature >= 35 && this.temperature < 37) {
        this.warningLevel = "黄色";
      } else if (this.temperature >= 37 && this.temperature < 40) {
        this.warningLevel = "橙色";
      } else if (this.temperature >= 40) {
        this.warningLevel = "红色";
      }
      // 通知所有观察者温度状况
      this.notifyAllObserver();
    }
  }
  /**
   * 设置温度值
   *
   * @param temperature
   */
  public void setTemperature(float temperature) {
    this.temperature = temperature;
    this.invoke();
  }
  /**
   * 获得温度预警
   */
  public String temperatureReport() {
    return " 温度:" + this.temperature;
  }
}

3.4个人观察者一PersonObserver

package com.demo.observer;
import com.demo.subject.ISubject;
/**
 * 个人用户观察者
 * @author
 *
 */
public class PersonObserver implements IObserver
{
  public void update(ISubject subject)
  {
    System.out.println("个人收到高温预警:" + subject.temperatureReport());
  }
}

3.5政府观察者一GovernmentObserver

package com.demo.observer;
import com.demo.subject.ISubject;
/**
 * 政府用户观察者
 * @author
 *
 */
public class GovernmentObserver implements IObserver
{
  public void update(ISubject subject)
  {
    System.out.println("政府部门收到高温预警:" + subject.temperatureReport());
  }
}

3.6企事业单位观察者一CompanyObserver

package com.demo.observer;
import com.demo.subject.ISubject;
/**
 * 企事业单位用户观察者
 * @author
 *
 */
public class CompanyObserver implements IObserver
{
  public void update(ISubject subject)
  {
    System.out.println("企事业单位收到高温预警:" + subject.temperatureReport());
  }
}

3.7让系统开始运行一Client

package com.demo;
import java.util.Random;
import com.demo.observer.CompanyObserver;
import com.demo.observer.GovernmentObserver;
import com.demo.observer.PersonObserver;
import com.demo.subject.ISubject;
import com.demo.subject.Subject;
/**
 * 客户端应用
 *
 * @author
 *
 */
public class Client {
  /**
   * @param args
   */
  public static void main(String[] args) {
    // 创建主题对象
    ISubject subject = new Subject();
    // 增加企事业单位观察者
    subject.add(new CompanyObserver());
    // 增加政府用户观察者
    subject.add(new GovernmentObserver());
    // 增加个人用户观察者
    subject.add(new PersonObserver());
    Random random = new Random();
    int i = 0;
    while (++i < 10) {
      // 设置随机温度
      subject.setTemperature(random.nextInt(45));
    }
  }
}

4 运行结果

======气象部门发布高温黄色警报!======
企事业单位收到高温预警: 温度:35.0
政府部门收到高温预警: 温度:35.0
个人收到高温预警: 温度:35.0
======气象部门发布高温红色警报!======
企事业单位收到高温预警: 温度:43.0
政府部门收到高温预警: 温度:43.0
个人收到高温预警: 温度:43.0
======气象部门发布高温橙色警报!======
企事业单位收到高温预警: 温度:37.0
政府部门收到高温预警: 温度:37.0
个人收到高温预警: 温度:37.0

三、该模式设计原则

1"开——闭"原则
2单一职责原则
3依赖倒置原则

四、使用场合

1 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,需要将这两个方面分别封装到独立对象中,彼此独立地改变和复用的时候。
2 当一个系统中一个对象的改变需要同时改变其他对象内容,但又不知道待改变对象到底有多少个的时候。
3 当一个对象的改变必须通知其他对象做出相应的变化,但是不能确定通知对象是谁的时候。

五、"推数据"静态类图

所谓"推数据",就是当被观察对象发生改变时,将相关数据通过参数形式传递给观察者,这就形成了被观察者"推数据"给观察者,静态类图如下:

六、"拉数据"静态类图

所谓"拉数据",观察者对象含有一个对被观察者对象实例的引用,当被观察者对象发生变化时,不会传递任何数据给观察者,而由观察者根据被观察者对象实例的引用主动获取相关的数据,这就形成了观察者主动从被观察对象中"拉数据“,静态类图如下:

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • java事务的概念浅析

    java事务的概念浅析

    在本篇内容里小编给大家整理的是一篇关于java事务的概念浅析,有兴趣的朋友们可以参考学习下。
    2020-12-12
  • spring整合redis实现数据缓存的实例代码

    spring整合redis实现数据缓存的实例代码

    这篇文章主要介绍了spring整合redis实现数据缓存,需要的朋友可以参考下
    2018-09-09
  • Spring boot中自定义Json参数解析器的方法

    Spring boot中自定义Json参数解析器的方法

    这篇文章主要介绍了Spring boot中自定义Json参数解析器的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • java读取csv文件内容示例代码

    java读取csv文件内容示例代码

    这篇文章主要介绍了java读取csv文件内容的示例,大家参考使用
    2013-12-12
  • Java实现Shazam声音识别算法的实例代码

    Java实现Shazam声音识别算法的实例代码

    Shazam算法采用傅里叶变换将时域信号转换为频域信号,并获得音频指纹,最后匹配指纹契合度来识别音频。这篇文章给大家介绍Java实现Shazam声音识别算法的实例代码,需要的朋友参考下吧
    2018-09-09
  • Java中线程的等待与唤醒_动力节点Java学院整理

    Java中线程的等待与唤醒_动力节点Java学院整理

    在Object.java中,定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。下面通过本文给大家介绍Java中线程的等待与唤醒知识,感兴趣的朋友一起看看吧
    2017-05-05
  • IDEA 中创建Spring Data Jpa 项目的示例代码

    IDEA 中创建Spring Data Jpa 项目的示例代码

    这篇文章主要介绍了IDEA 中创建Spring Data Jpa 项目的示例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • spring aop两种配置方式

    spring aop两种配置方式

    这篇文章主要为大家详细介绍了spring aop两种配置方式,主要是注解配置AOP和xml配置aop,需要的朋友可以参考下
    2015-09-09
  • java实现合并单元格的同时并导出excel示例

    java实现合并单元格的同时并导出excel示例

    这篇文章主要给大家介绍了关于java实现合并单元格的同时并导出excel的相关资料,文中先进行了简单的介绍,之后给出了详细的示例代码,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-03-03
  • 详解springboot + profile(不同环境读取不同配置)

    详解springboot + profile(不同环境读取不同配置)

    本篇文章主要介绍了springboot + profile(不同环境读取不同配置),具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05

最新评论