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设计模式之策略模式(Strategy模式)介绍
  • Java基于状态模式实现的文档编辑模式切换功能实例
  • Java使用访问者模式解决公司层级结构图问题详解
  • Java基于代理模式解决红酒经销问题详解
  • Java基于命令模式实现邮局发信功能详解
  • Java使用责任链模式处理学生请假问题详解
  • Java使用备忘录模式实现过关类游戏功能详解
  • Java使用策略模式解决商场促销商品问题示例
(0)

相关推荐

  • Java策略模式的简单应用实现方法

    在使用图像处理软件处理图片后,需要选择一种格式进行保存.然而各种格式在底层实现的算法并不相同,这刚好适合策略模式.编写程序,演示如何使用策略模式与简单工厂模式组合进行开发. 思路如下: 1.使用interface来定义一个接口,在该接口中定义save()方法:2.根据图片格式定义不同的类,分别在这些类中使用关键字implements实现接口:3.创建一个实现选择的类,在该类中定义实现选择的方法,该方法返回值为对应的图片保存类:4.在主方法中实现接口.代码如下: 复制代码 代码如下: public

  • Java基于代理模式解决红酒经销问题详解

    本文实例讲述了Java基于代理模式解决红酒经销问题.分享给大家供大家参考,具体如下: 一. 模式定义 在代理模式中,有两个对象参与处理同一请求,接收的请求由代理对象委托给真实对象处理,代理对象控制请求的访问,它在客户端应用程序与真实对象之间起到了一个中介桥梁的作用.代理模式使用对象聚合代替继承,有效地降低了软件模块之间的耦合度. 二. 模式举例 1 模式分析 我们借用红酒经销来说明这一模式. 2 代理模式静态类图 3 代码示例 3.1 红酒工厂接口一IRedWine package com.de

  • Java使用责任链模式处理学生请假问题详解

    本文实例讲述了Java使用责任链模式处理学生请假问题.分享给大家供大家参考,具体如下: 一. 模式定义 在责任链模式中,很多对象由每一个对象对其下家的引用而连接起来,形成一条链.客户端应用请求在这个链上进行传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪个对象最终处理这个请求,这使系统可以在不影响客户端的情况下动态地重新组织链和分配责任. (1)抽象处理者角色:定义出一个处理请求的接口.如果需要,接口可以定义出一个方法,以设定和返回下家的引用.这个角色通常由一个Ja

  • Java基于命令模式实现邮局发信功能详解

    本文实例讲述了Java基于命令模式实现邮局发信功能.分享给大家供大家参考,具体如下: 一. 模式定义 命令模式,将来自客户端的请求封建为一个对象,无须了解这个请求激活的动作或有关接受这个请求的处理细节.命令模式的根本目的在于将"请求者"与"实现者"之间解耦. 二. 模式举例 1 模式分析 我们借用邮局发信来说明这一模式. 2 命令模式静态类图 3 代码示例 3.1信件接收者接口一IReceiver package com.demo.receiver; /** * 信

  • Java使用备忘录模式实现过关类游戏功能详解

    本文实例讲述了Java使用备忘录模式实现过关类游戏功能.分享给大家供大家参考,具体如下: 一.模式定义 备忘录模式,在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象外部保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 二.模式举例 1模式分析 我们借用过关类游戏来说明这一模式. 2备忘录模式静态类图 3代码示例(黑箱备忘录模式) 3.1创建备忘录窄接口一INarrowMemento package com.demo.memento; /** * 备忘录窄接口(不提供任何方法,外部

  • Java基于状态模式实现的文档编辑模式切换功能实例

    本文实例讲述了Java基于状态模式实现的文档编辑模式切换功能.分享给大家供大家参考,具体如下: 一 模式定义 状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来就像是改变了其类. 二 模式举例 1 模式分析 我们借用文档编辑模式切换这一案例来说明这一模式. 2 状态模式静态类图 3 代码示例 3.1 创建状态接口一IState package com.demo.state; import com.demo.context.Context; /** * * 状态接口 * * @au

  • Java使用策略模式解决商场促销商品问题示例

    本文实例讲述了Java使用策略模式解决商场促销商品问题.分享给大家供大家参考,具体如下: 一 模式定义 策略模式:定义一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户应用而独立变化. 二 模式举例 1 模式分析 我们借用商场促销商品来说明这一模式. 2 策略模式静态类图 3 代码示例 3.1 创建策略接口一IStrategy package com.demo.strategy; /** * 策略接口 * * @author * */ public inter

  • 对比Java设计模式编程中的状态模式和策略模式

    为了能在Java应用程序中正确的使用状态模式和策略模式,开发人员需要清楚地知道这两种模式之间的区别.尽管状态模式和策略模式的结构非常相似,它们又同样遵循开闭原则,都代表着SOLID设计原则的'O',但它们的意图是完全不同的.Java中的策略模式是对一组相关的算法进行封装,给调用方提供了运行时的灵活性.调用方可以在运行时选择不同的算法,而不用修改使用策略的那个Context类.使用策略模式的经典例子包括实现加密算法,压缩算法,以及排序算法.另一方面,状态模式使用一个对象可以在不同的状态下表现出不同

  • Java使用访问者模式解决公司层级结构图问题详解

    本文实例讲述了Java使用访问者模式解决公司层级结构图问题.分享给大家供大家参考,具体如下: 一. 模式定义 访问者模式:是表示一个作用于某对象结构中各个元素的操作,它使用户可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二. 模式举例 1 模式分析 我们借用公司层级结构来说明这一模式. 2 访问者模式静态类图 3 代码示例 3.1 抽象员工一Staff package com.demo.structure; import com.demo.visitor.IVisitor; /**

  • Java设计模式之策略模式(Strategy模式)介绍

    Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线,一个是框图(bar),这是两种算法,可以使用Strategy实现. 这里以字符串替代为例,有一个文件,我们需要读取后,希望替代其中相应的变量,然后输出.关于替代其中变量的方法可能有多种方法,这取决于用户的要求,所以我们要准备几套变量字符替代方案. 首先,我们建立一个抽象类RepTempRule 定义

随机推荐