最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用觀察者模式實現(xiàn)氣象局高溫預(yù)警功能示例

 更新時間:2018年04月28日 11:52:25   作者:chengqiuming  
這篇文章主要介紹了Java使用觀察者模式實現(xiàn)氣象局高溫預(yù)警功能,結(jié)合完整實例形式分析了java觀察者模式實現(xiàn)氣象局高溫預(yù)警的相關(guān)接口定義、使用、功能操作技巧,并總結(jié)了其設(shè)計原則與適用場合,具有一定參考借鑒價值,需要的朋友可以參考下

本文實例講述了Java使用觀察者模式實現(xiàn)氣象局高溫預(yù)警功能。分享給大家供大家參考,具體如下:

一、模式定義

觀察者模式,又稱為發(fā)布/訂閱模式。觀察者模式定義了對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新。

二、模式舉例

1 模式分析

我們借用氣象局高溫預(yù)警來說明這一模式。

2 觀察者模式靜態(tài)類圖

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);
  /**
   * 通知所有觀察者更新數(shù)據(jù)
   */
  public void notifyAllObserver();
  /**
   * 設(shè)置溫度值
   *
   * @param temperature
   */
  public void setTemperature(float temperature);
  /**
   * 獲得溫度預(yù)警
   *
   * @return
   */
  public String temperatureReport();
}

3.3具體主題實現(xiàn)一Subject

package com.demo.subject;
import java.util.Iterator;
import java.util.Vector;
import com.demo.observer.IObserver;
/**
 * 主題實現(xiàn)類(被觀察者)
 *
 * @author
 *
 */
public class Subject implements ISubject {
  // 溫度
  /**
   * (一)高溫黃色預(yù)警信號
   *
   * 標(biāo)準(zhǔn):連續(xù)三天日最高氣溫將在35℃以上。
   *
   * (二)高溫橙色預(yù)警信號
   *
   * 標(biāo)準(zhǔn):24小時內(nèi)最高氣溫將升至37℃以上。
   *
   * (三)高溫紅色預(yù)警信號
   *
   * 標(biāo)準(zhǔn):24小時內(nèi)最高氣溫將升至40℃以上。
   */
  private float temperature;
  // 預(yù)警級別
  private String warningLevel;
  // 保存觀察者列表
  private final Vector<IObserver> vector;
  /**
   * 構(gòu)造方法 初始化觀察者列表
   */
  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);
  }
  /**
   * 通知所有觀察者更新數(shù)據(jù)
   */
  public void notifyAllObserver() {
    System.out.println("======氣象部門發(fā)布高溫" + this.warningLevel + "警報!======");
    Iterator<IObserver> iterator = vector.iterator();
    while (iterator.hasNext()) {
      (iterator.next()).update(this);
    }
  }
  /**
   * 私有方法 根據(jù)溫度值設(shè)置預(yù)警級別 然后通知所有觀察者
   */
  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();
    }
  }
  /**
   * 設(shè)置溫度值
   *
   * @param temperature
   */
  public void setTemperature(float temperature) {
    this.temperature = temperature;
    this.invoke();
  }
  /**
   * 獲得溫度預(yù)警
   */
  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("個人收到高溫預(yù)警:" + 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("政府部門收到高溫預(yù)警:" + subject.temperatureReport());
  }
}

3.6企事業(yè)單位觀察者一CompanyObserver

package com.demo.observer;
import com.demo.subject.ISubject;
/**
 * 企事業(yè)單位用戶觀察者
 * @author
 *
 */
public class CompanyObserver implements IObserver
{
  public void update(ISubject subject)
  {
    System.out.println("企事業(yè)單位收到高溫預(yù)警:" + subject.temperatureReport());
  }
}

3.7讓系統(tǒng)開始運行一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;
/**
 * 客戶端應(yīng)用
 *
 * @author
 *
 */
public class Client {
  /**
   * @param args
   */
  public static void main(String[] args) {
    // 創(chuàng)建主題對象
    ISubject subject = new Subject();
    // 增加企事業(yè)單位觀察者
    subject.add(new CompanyObserver());
    // 增加政府用戶觀察者
    subject.add(new GovernmentObserver());
    // 增加個人用戶觀察者
    subject.add(new PersonObserver());
    Random random = new Random();
    int i = 0;
    while (++i < 10) {
      // 設(shè)置隨機溫度
      subject.setTemperature(random.nextInt(45));
    }
  }
}

4 運行結(jié)果

======氣象部門發(fā)布高溫黃色警報!======
企事業(yè)單位收到高溫預(yù)警: 溫度:35.0
政府部門收到高溫預(yù)警: 溫度:35.0
個人收到高溫預(yù)警: 溫度:35.0
======氣象部門發(fā)布高溫紅色警報!======
企事業(yè)單位收到高溫預(yù)警: 溫度:43.0
政府部門收到高溫預(yù)警: 溫度:43.0
個人收到高溫預(yù)警: 溫度:43.0
======氣象部門發(fā)布高溫橙色警報!======
企事業(yè)單位收到高溫預(yù)警: 溫度:37.0
政府部門收到高溫預(yù)警: 溫度:37.0
個人收到高溫預(yù)警: 溫度:37.0

三、該模式設(shè)計原則

1"開——閉"原則
2單一職責(zé)原則
3依賴倒置原則

四、使用場合

1 當(dāng)一個抽象模型有兩個方面,其中一個方面依賴于另一個方面,需要將這兩個方面分別封裝到獨立對象中,彼此獨立地改變和復(fù)用的時候。
2 當(dāng)一個系統(tǒng)中一個對象的改變需要同時改變其他對象內(nèi)容,但又不知道待改變對象到底有多少個的時候。
3 當(dāng)一個對象的改變必須通知其他對象做出相應(yīng)的變化,但是不能確定通知對象是誰的時候。

五、"推數(shù)據(jù)"靜態(tài)類圖

所謂"推數(shù)據(jù)",就是當(dāng)被觀察對象發(fā)生改變時,將相關(guān)數(shù)據(jù)通過參數(shù)形式傳遞給觀察者,這就形成了被觀察者"推數(shù)據(jù)"給觀察者,靜態(tài)類圖如下:

六、"拉數(shù)據(jù)"靜態(tài)類圖

所謂"拉數(shù)據(jù)",觀察者對象含有一個對被觀察者對象實例的引用,當(dāng)被觀察者對象發(fā)生變化時,不會傳遞任何數(shù)據(jù)給觀察者,而由觀察者根據(jù)被觀察者對象實例的引用主動獲取相關(guān)的數(shù)據(jù),這就形成了觀察者主動從被觀察對象中"拉數(shù)據(jù)“,靜態(tài)類圖如下:

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計入門與進階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設(shè)計有所幫助。

相關(guān)文章

  • Java數(shù)據(jù)庫連接_jdbc-odbc橋連接方式(詳解)

    Java數(shù)據(jù)庫連接_jdbc-odbc橋連接方式(詳解)

    下面小編就為大家?guī)硪黄狫ava數(shù)據(jù)庫連接_jdbc-odbc橋連接方式(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 如何使用jenkins實現(xiàn)發(fā)布部分更新文件

    如何使用jenkins實現(xiàn)發(fā)布部分更新文件

    這篇文章主要介紹了如何使用jenkins實現(xiàn)發(fā)布部分更新文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • 一文教會你使用jmap和MAT進行堆內(nèi)存溢出分析

    一文教會你使用jmap和MAT進行堆內(nèi)存溢出分析

    本文介紹關(guān)于jmap和MAT的使用來進行堆內(nèi)存溢出分析,因為這個內(nèi)存溢出是我們手動構(gòu)造出來的,查找比較簡單,真的到了生產(chǎn)上面需要我們仔細(xì)排除
    2021-09-09
  • Java equals()方法使用詳解及總結(jié)

    Java equals()方法使用詳解及總結(jié)

    這篇文章主要介紹了Java equals()方法使用詳解及總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Idea安裝及涉及springboot詳細(xì)配置的圖文教程

    Idea安裝及涉及springboot詳細(xì)配置的圖文教程

    這篇文章主要介紹了Idea安裝及涉及springboot詳細(xì)配置,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Spring Boot從Controller層進行單元測試的實現(xiàn)

    Spring Boot從Controller層進行單元測試的實現(xiàn)

    這篇文章主要介紹了Spring Boot從Controller層進行單元測試的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Java代碼中如何去掉煩人的“!=null”

    Java代碼中如何去掉煩人的“!=null”

    這篇文章主要介紹了Java代碼中去掉煩人的“!=null”,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 基于JVM 中常見垃圾收集算法介紹

    基于JVM 中常見垃圾收集算法介紹

    下面小編就為大家分享一篇基于JVM 中常見垃圾收集算法介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Spring Boot2發(fā)布調(diào)用REST服務(wù)實現(xiàn)方法

    Spring Boot2發(fā)布調(diào)用REST服務(wù)實現(xiàn)方法

    這篇文章主要介紹了Spring Boot2發(fā)布調(diào)用REST服務(wù)實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Hibernate的各種保存方式的區(qū)別詳解

    Hibernate的各種保存方式的區(qū)別詳解

    今天小編就為大家分享一篇關(guān)于Hibernate的各種保存方式的區(qū)別詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03

最新評論

西藏| 陈巴尔虎旗| 江华| 涞水县| 凌云县| 黄骅市| 东兴市| 鹤庆县| 西充县| 确山县| 喀什市| 图片| 东兴市| 通榆县| 崇阳县| 康定县| 大城县| 岳池县| 枣阳市| 芦山县| 乌鲁木齐市| 新邵县| 巴塘县| 哈巴河县| 晋城| 化德县| 清徐县| 无为县| 肥乡县| 梨树县| 青河县| 开阳县| 宁都县| 台北市| 安泽县| 江达县| 伊金霍洛旗| 岱山县| 天津市| 湛江市| 鄱阳县|