觀察者模式

  • UML類圖

觀察模式UML類圖
  • 定義

定義對象間一種一對多的依賴關(guān)系,使得每當(dāng)一個對象改變狀態(tài),則所有依賴于它的對象都會得到通知并被自動更新。

  • 使用場景

  • 關(guān)聯(lián)行為場景。需要注意的是,關(guān)聯(lián)行為是可拆分的,而不是“組合”關(guān)系;

  • 事件多級觸發(fā)場景;

  • 跨系統(tǒng)的消息交換場景,如消息隊列、事件總線的處理機(jī)制。

  • 代碼舉例說明

Coder是個程序員,他每周都要閱讀WeeklyBlog,為了方便,就有了訂閱。

Coder.java

 package com.design.observer;

 import java.util.Observable;
 import java.util.Observer;

 public class Coder implements Observer{

    @Override
    public void update(Observable arg0, Object arg1) {
        // TODO Auto-generated method stub
        System.out.println("update");
    }   
  }

WeeklyBlog.java

 package com.design.observer;

 import java.util.Observable;

 public class WeeklyBlog extends Observable{
    
    public void notifyUpate(String content){
        notifyObservers(content);
    }
 }

App.java

package com.design.observer;

public class App {

   public static void main(String[] args) {
       // 被觀察的角色
       WeeklyBlog weeklyBlog = new WeeklyBlog();
       // 觀察者
       Coder coder1 = new Coder();
       Coder coder2 = new Coder();
       Coder coder3 = new Coder();

       // 將觀察者注冊到可觀察對象的觀察者列表中
       weeklyBlog.addObserver(coder1);
       weeklyBlog.addObserver(coder2);
       weeklyBlog.addObserver(coder3);

       // 發(fā)布消息
       weeklyBlog.notifyUpate("新的一期WeeklyBlog來啦!");
   }
 }
  • 總結(jié)優(yōu)缺點(diǎn)

Android 中 ListView 主要運(yùn)用了 Adapter 和觀察者模式使得可擴(kuò)展性、靈活性非常強(qiáng),而耦合度卻很低。

  • 優(yōu)點(diǎn)
    觀察者和被觀察者之間是抽象耦合
  • 缺點(diǎn)
    觀察者模式需要考慮一下開發(fā)效率和運(yùn)行效率問題,一個被觀察者,多個觀察者,開發(fā)和調(diào)試就會比較復(fù)雜,而且在 Java 中消息的通知默認(rèn)是順序執(zhí)行,一個觀察者卡殼,會影響整體的執(zhí)行效率。在這種情況下,一般考慮采用異步的方式。同時,如果在被觀察者之間有循環(huán)依賴的話, 被觀察者會觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用,導(dǎo)致系統(tǒng)崩潰。在使用觀察考模式時要特別注意這一點(diǎn)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容