九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
觀察者模式——?dú)庀缶指邷鼐?/div>

一模式定義

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

 

二模式舉例

1 模式分析

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



 

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


 

3代碼示例

3.1觀察者接口一IObserver

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

3.2主題接口一ISubject

Java代碼  
  1. package com.demo.subject;  
  2.   
  3. import com.demo.observer.IObserver;  
  4.   
  5. /** 
  6.  * 主題接口(被觀察者) 
  7.  *  
  8.  * @author 
  9.  *  
  10.  */  
  11. public interface ISubject  
  12. {  
  13.     /** 
  14.      * 增加觀察者 
  15.      *  
  16.      * @param observer 
  17.      * @return 
  18.      */  
  19.     public boolean add(IObserver observer);  
  20.   
  21.     /** 
  22.      * 刪除觀察者 
  23.      *  
  24.      * @param observer 
  25.      * @return 
  26.      */  
  27.     public boolean remove(IObserver observer);  
  28.   
  29.     /** 
  30.      * 通知所有觀察者更新數(shù)據(jù) 
  31.      */  
  32.     public void notifyAllObserver();  
  33.   
  34.     /** 
  35.      * 設(shè)置溫度值 
  36.      *  
  37.      * @param temperature 
  38.      */  
  39.     public void setTemperature(float temperature);  
  40.   
  41.     /** 
  42.      * 獲得溫度預(yù)警 
  43.      *  
  44.      * @return 
  45.      */  
  46.     public String temperatureReport();  
  47. }  

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

Java代碼  
  1. package com.demo.subject;  
  2.   
  3. import java.util.Iterator;  
  4. import java.util.Vector;  
  5.   
  6. import com.demo.observer.IObserver;  
  7.   
  8. /** 
  9.  * 主題實(shí)現(xiàn)類(被觀察者) 
  10.  *  
  11.  * @author 
  12.  *  
  13.  */  
  14. public class Subject implements ISubject {  
  15.     // 溫度  
  16.     /** 
  17.      * (一)高溫黃色預(yù)警信號(hào) 
  18.      *  
  19.      * 標(biāo)準(zhǔn):連續(xù)三天日最高氣溫將在35℃以上。 
  20.      *  
  21.      * (二)高溫橙色預(yù)警信號(hào) 
  22.      *  
  23.      * 標(biāo)準(zhǔn):24小時(shí)內(nèi)最高氣溫將升至37℃以上。 
  24.      *  
  25.      * (三)高溫紅色預(yù)警信號(hào) 
  26.      *  
  27.      * 標(biāo)準(zhǔn):24小時(shí)內(nèi)最高氣溫將升至40℃以上。 
  28.      */  
  29.     private float temperature;  
  30.     // 預(yù)警級(jí)別  
  31.     private String warningLevel;  
  32.   
  33.     // 保存觀察者列表  
  34.     private final Vector<IObserver> vector;  
  35.   
  36.     /** 
  37.      * 構(gòu)造方法 初始化觀察者列表 
  38.      */  
  39.     public Subject() {  
  40.         vector = new Vector<IObserver>();  
  41.     }  
  42.   
  43.     /** 
  44.      * 增加觀察者 
  45.      */  
  46.     public boolean add(IObserver observer) {  
  47.         if (observer != null && !vector.contains(observer)) {  
  48.             return vector.add(observer);  
  49.         }  
  50.   
  51.         return false;  
  52.     }  
  53.   
  54.     /** 
  55.      * 移除觀察者 
  56.      */  
  57.     public boolean remove(IObserver observer) {  
  58.         return vector.remove(observer);  
  59.     }  
  60.   
  61.     /** 
  62.      * 通知所有觀察者更新數(shù)據(jù) 
  63.      */  
  64.     public void notifyAllObserver() {  
  65.         System.out.println("======氣象部門發(fā)布高溫" + this.warningLevel + "警報(bào)!======");  
  66.         Iterator<IObserver> iterator = vector.iterator();  
  67.         while (iterator.hasNext()) {  
  68.             (iterator.next()).update(this);  
  69.         }  
  70.     }  
  71.   
  72.     /** 
  73.      * 私有方法 根據(jù)溫度值設(shè)置預(yù)警級(jí)別 然后通知所有觀察者 
  74.      */  
  75.     private void invoke() {  
  76.         if (this.temperature >= 35) {  
  77.             if (this.temperature >= 35 && this.temperature < 37) {  
  78.                 this.warningLevel = "黃色";  
  79.             } else if (this.temperature >= 37 && this.temperature < 40) {  
  80.                 this.warningLevel = "橙色";  
  81.             } else if (this.temperature >= 40) {  
  82.                 this.warningLevel = "紅色";  
  83.             }  
  84.             // 通知所有觀察者溫度狀況  
  85.             this.notifyAllObserver();  
  86.         }  
  87.     }  
  88.   
  89.     /** 
  90.      * 設(shè)置溫度值 
  91.      *  
  92.      * @param temperature 
  93.      */  
  94.     public void setTemperature(float temperature) {  
  95.         this.temperature = temperature;  
  96.   
  97.         this.invoke();  
  98.     }  
  99.   
  100.     /** 
  101.      * 獲得溫度預(yù)警 
  102.      */  
  103.     public String temperatureReport() {  
  104.         return " 溫度:" + this.temperature;  
  105.     }  
  106.   
  107. }  

3.4個(gè)人觀察者一PersonObserver

Java代碼  
  1. package com.demo.observer;  
  2.   
  3. import com.demo.subject.ISubject;  
  4. /** 
  5.  * 個(gè)人用戶觀察者 
  6.  * @author  
  7.  * 
  8.  */  
  9. public class PersonObserver implements IObserver  
  10. {  
  11.   
  12.     public void update(ISubject subject)  
  13.     {  
  14.         System.out.println("個(gè)人收到高溫預(yù)警:" + subject.temperatureReport());  
  15.     }  
  16.   
  17. }  

3.5政府觀察者一GovernmentObserver

Java代碼  
  1. package com.demo.observer;  
  2.   
  3. import com.demo.subject.ISubject;  
  4. /** 
  5.  * 政府用戶觀察者 
  6.  * @author  
  7.  * 
  8.  */  
  9. public class GovernmentObserver implements IObserver  
  10. {  
  11.   
  12.     public void update(ISubject subject)  
  13.     {  
  14.         System.out.println("政府部門收到高溫預(yù)警:" + subject.temperatureReport());  
  15.     }  
  16.   
  17. }  

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

Java代碼  
  1. package com.demo.observer;  
  2.   
  3. import com.demo.subject.ISubject;  
  4. /** 
  5.  * 企事業(yè)單位用戶觀察者 
  6.  * @author  
  7.  * 
  8.  */  
  9. public class CompanyObserver implements IObserver  
  10. {  
  11.   
  12.     public void update(ISubject subject)  
  13.     {  
  14.         System.out.println("企事業(yè)單位收到高溫預(yù)警:" + subject.temperatureReport());  
  15.   
  16.     }  
  17.   
  18. }  

3.7讓系統(tǒng)開(kāi)始運(yùn)行一Client

Java代碼  
  1. package com.demo;  
  2.   
  3. import java.util.Random;  
  4.   
  5. import com.demo.observer.CompanyObserver;  
  6. import com.demo.observer.GovernmentObserver;  
  7. import com.demo.observer.PersonObserver;  
  8. import com.demo.subject.ISubject;  
  9. import com.demo.subject.Subject;  
  10.   
  11. /** 
  12.  * 客戶端應(yīng)用 
  13.  *  
  14.  * @author 
  15.  *  
  16.  */  
  17. public class Client {  
  18.   
  19.     /** 
  20.      * @param args 
  21.      */  
  22.     public static void main(String[] args) {  
  23.         // 創(chuàng)建主題對(duì)象  
  24.         ISubject subject = new Subject();  
  25.   
  26.         // 增加企事業(yè)單位觀察者  
  27.         subject.add(new CompanyObserver());  
  28.         // 增加政府用戶觀察者  
  29.         subject.add(new GovernmentObserver());  
  30.         // 增加個(gè)人用戶觀察者  
  31.         subject.add(new PersonObserver());  
  32.   
  33.         Random random = new Random();  
  34.         int i = 0;  
  35.         while (++i < 10) {  
  36.             // 設(shè)置隨機(jī)溫度  
  37.             subject.setTemperature(random.nextInt(45));  
  38.         }  
  39.     }  
  40. }  

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"開(kāi)——閉"原則

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)類圖如下:



 

六"拉數(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)類圖如下:



 

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服