一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|JavaScript|易語(yǔ)言|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - Java使用觀察者模式實(shí)現(xiàn)氣象局高溫預(yù)警功能示例

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

2021-04-24 11:42chengqiuming Java教程

這篇文章主要介紹了Java使用觀察者模式實(shí)現(xiàn)氣象局高溫預(yù)警功能,結(jié)合完整實(shí)例形式分析了java觀察者模式實(shí)現(xiàn)氣象局高溫預(yù)警的相關(guān)接口定義、使用、功能操作技巧,并總結(jié)了其設(shè)計(jì)原則與適用場(chǎng)合,具有一定參考借鑒價(jià)值,需要的朋

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

一、模式定義

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

二、模式舉例

1 模式分析

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

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

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

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

3 代碼示例

3.1觀察者接口一iobserver

?
1
2
3
4
5
6
7
8
9
10
11
12
package com.demo.observer;
import com.demo.subject.isubject;
/**
 * 觀察者接口
 * @author
 *
 */
public interface iobserver
{
  //更新方法
  public void update(isubject subject);
}

3.2主題接口一isubject

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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具體主題實(shí)現(xiàn)一subject

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package com.demo.subject;
import java.util.iterator;
import java.util.vector;
import com.demo.observer.iobserver;
/**
 * 主題實(shí)現(xiàn)類(被觀察者)
 *
 * @author
 *
 */
public class subject implements isubject {
  // 溫度
  /**
   * (一)高溫黃色預(yù)警信號(hào)
   *
   * 標(biāo)準(zhǔn):連續(xù)三天日最高氣溫將在35℃以上。
   *
   * (二)高溫橙色預(yù)警信號(hào)
   *
   * 標(biāo)準(zhǔn):24小時(shí)內(nèi)最高氣溫將升至37℃以上。
   *
   * (三)高溫紅色預(yù)警信號(hào)
   *
   * 標(biāo)準(zhǔn):24小時(shí)內(nèi)最高氣溫將升至40℃以上。
   */
  private float temperature;
  // 預(yù)警級(jí)別
  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 + "警報(bào)!======");
    iterator<iobserver> iterator = vector.iterator();
    while (iterator.hasnext()) {
      (iterator.next()).update(this);
    }
  }
  /**
   * 私有方法 根據(jù)溫度值設(shè)置預(yù)警級(jí)別 然后通知所有觀察者
   */
  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個(gè)人觀察者一personobserver

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.demo.observer;
import com.demo.subject.isubject;
/**
 * 個(gè)人用戶觀察者
 * @author
 *
 */
public class personobserver implements iobserver
{
  public void update(isubject subject)
  {
    system.out.println("個(gè)人收到高溫預(yù)警:" + subject.temperaturereport());
  }
}

3.5政府觀察者一governmentobserver

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)開始運(yùn)行一client

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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)建主題對(duì)象
    isubject subject = new subject();
    // 增加企事業(yè)單位觀察者
    subject.add(new companyobserver());
    // 增加政府用戶觀察者
    subject.add(new governmentobserver());
    // 增加個(gè)人用戶觀察者
    subject.add(new personobserver());
    random random = new random();
    int i = 0;
    while (++i < 10) {
      // 設(shè)置隨機(jī)溫度
      subject.settemperature(random.nextint(45));
    }
  }
}

4 運(yùn)行結(jié)果

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

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

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

四、使用場(chǎng)合

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

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

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

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

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

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

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

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

原文鏈接:https://blog.csdn.net/chengqiuming/article/details/70139427

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 97影音 | 日韩精品一区二区三区毛片 | 日本加勒比在线精品视频 | 国产成+人+综合+亚洲不卡 | 黑人好大好硬好深好爽想要h | 99精品视频只99有精品 | 欧美综合国产精品日韩一 | 欧美在线播放成人免费 | 免费的网址 | 精品国产在天天线在线麻豆 | 男人猛戳女人下部30分钟 | 亚洲成a人片777777久久 | 亚洲欧美日韩另类在线一 | 好男人资源免费播放在线观看 | 公翁的舌尖研磨她的花蒂小说 | 视频一区二区国产无限在线观看 | 四虎影视网址 | 四虎影视永久在线观看 | 国产九九热视频 | 国产成人精品实拍在线 | 国产免费资源高清小视频在线观看 | 色啊色| 调教全程肉动画片在线观看 | 亚洲第一在线 | 2021麻豆剧果冻传媒入口永久 | 亚洲电影不卡 | 国产a免费观看 | 日韩无遮挡大尺度啪啪影片 | 成人在线播放视频 | 国产一区二区不卡视频 | 国产成人影院在线观看 | 国产日韩精品一区二区在线观看 | 国产香蕉一区二区在线观看 | 香港三级浴室女警官 | 98精品全国免费观看视频 | 国语精彩对白2021 | 国产精品玖玖玖影院 | 91真人毛片一级在线播放 | 久久亚洲精品中文字幕60分钟 | 女色在线观看免费视频 | 私人影院在线播放 |