欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java設(shè)計模式開發(fā)中使用觀察者模式的實例教程

 更新時間:2016年04月24日 09:53:43   作者:匆忙擁擠repeat  
這篇文章主要介紹了Java設(shè)計模式開發(fā)中使用觀察者模式的實例教程,松耦合和邏輯清晰的消息監(jiān)聽是觀察者模式的大特色,需要的朋友可以參考下

觀察者模式是軟件設(shè)計模式中的一種,使用也比較普遍,尤其是在GUI編程中。關(guān)于設(shè)計模式的文章,網(wǎng)絡(luò)上寫的都比較多,而且很多文章寫的也不錯,雖然說有一種重復(fù)早輪子的嫌疑,但此輪子非彼輪子,側(cè)重點(diǎn)不同,思路也不同,講述方式也不近相同。
關(guān)鍵要素

主題:

主題是觀察者觀察的對象,一個主題必須具備下面三個特征。

  • 持有監(jiān)聽的觀察者的引用
  • 支持增加和刪除觀察者
  • 主題狀態(tài)改變,通知觀察者

觀察者:

當(dāng)主題發(fā)生變化,收到通知進(jìn)行具體的處理是觀察者必須具備的特征。

為什么要用這種模式

這里舉一個例子來說明,牛奶送奶站就是主題,訂奶客戶為監(jiān)聽者,客戶從送奶站訂閱牛奶后,會每天收到牛奶。如果客戶不想訂閱了,可以取消,以后就不會收到牛奶。

松耦合

觀察者增加或刪除無需修改主題的代碼,只需調(diào)用主題對應(yīng)的增加或者刪除的方法即可。
主題只負(fù)責(zé)通知觀察者,但無需了解觀察者如何處理通知。舉個例子,送奶站只負(fù)責(zé)送遞牛奶,不關(guān)心客戶是喝掉還是洗臉。
觀察者只需等待主題通知,無需觀察主題相關(guān)的細(xì)節(jié)。還是那個例子,客戶只需關(guān)心送奶站送到牛奶,不關(guān)心牛奶由哪個快遞人員,使用何種交通工具送達(dá)。

Java實現(xiàn)觀察者模式
1. Java自帶的實現(xiàn)
類圖

201642494900291.jpg (806×524)

/** 
 * 觀察目標(biāo) 繼承自 java.util.Observable 
 * @author stone 
 * 
 */ 
public class UpdateObservable extends Observable { 
   
  private int data; 
   
  public UpdateObservable(Observer observer) { 
    addObserver(observer); 
    /* 
     * add other observer 
     */ 
  } 
   
  public int getData() { 
    return data; 
  } 
   
  public void setData(int data) { 
    if (data != this.data) { 
      this.data = data; 
      setChanged(); //標(biāo)記 改變, 只有標(biāo)記后才能通知到 
      notifyObservers(); //通知 
    } 
     
  } 
 
  @Override 
  public synchronized void addObserver(Observer o) { 
    super.addObserver(o); 
  } 
 
  @Override 
  public synchronized void deleteObserver(Observer o) { 
    super.deleteObserver(o); 
  } 
 
  @Override 
  public void notifyObservers() { 
    super.notifyObservers(); 
  } 
 
  @Override 
  public void notifyObservers(Object arg) { 
    super.notifyObservers(arg); 
  } 
 
  @Override 
  public synchronized void deleteObservers() { 
    super.deleteObservers(); 
  } 
 
  @Override 
  protected synchronized void setChanged() { 
    super.setChanged(); 
  } 
 
  @Override 
  protected synchronized void clearChanged() { 
    super.clearChanged(); 
  } 
 
  @Override 
  public synchronized boolean hasChanged() { 
    return super.hasChanged(); 
  } 
 
  @Override 
  public synchronized int countObservers() { 
    return super.countObservers(); 
  } 
   
} 

/** 
 * 觀察者 實現(xiàn) java.util.Observer接口 
 * @author stone 
 * 
 */ 
public class UpdateObserver implements Observer { 
 
  @Override 
  public void update(Observable o, Object arg) { 
    System.out.println("接收到數(shù)據(jù)變化的通知:"); 
    if (o instanceof UpdateObservable) { 
      UpdateObservable uo = (UpdateObservable) o; 
      System.out.print("數(shù)據(jù)變更為:" + uo.getData()); 
    } 
  } 
 
} 

2. 自定義的觀察模型
類圖

201642494952492.jpg (968×676)

/** 
 * 抽象觀察者  Observer 
 * 觀察 更新     
 * @author stone 
 * 
 */ 
public interface IWatcher { 
  /* 
   * 通知接口: 
   * 1. 簡單通知 
   * 2. 觀察者需要目標(biāo)的變化的數(shù)據(jù),那么可以將目標(biāo)用作參數(shù), 見Java的Observer和Observable 
   */ 
// void update(IWatched watched); 
   
  void update(); 
   
} 

/** 
 * 抽象目標(biāo) Subject 
 * 提供注冊和刪除觀察者對象的接口, 及通知觀察者進(jìn)行觀察的接口 
 * 及目標(biāo) 自身被觀察的業(yè)務(wù)的接口 
 * @author stone 
 * 
 */ 
public interface IWatchedSubject { 
   
  public void add(IWatcher watch); 
 
  public void remove(IWatcher watch); 
   
  public void notifyWhatchers(); 
   
  public void update();//被觀察業(yè)務(wù)變化的接口 
} 

/** 
 * 具體觀察者    Concrete Observer 
 * 
 * @author stone 
 * 
 */ 
public class UpdateWatcher implements IWatcher { 
 
  @Override 
  public void update() { 
    System.out.println(this + "觀察到:目標(biāo)已經(jīng)更新了"); 
  } 
 
} 


/** 
 * 具體目標(biāo)角色  Concrete Subject 
 * @author stone 
 * 
 */ 
public class UpdateWatchedSubject implements IWatchedSubject { 
  private List<IWatcher> list; 
   
  public UpdateWatchedSubject() { 
    this.list = new ArrayList<IWatcher>(); 
  } 
   
  @Override 
  public void add(IWatcher watch) { 
    this.list.add(watch); 
  } 
 
  @Override 
  public void remove(IWatcher watch) { 
    this.list.remove(watch); 
  } 
 
  @Override 
  public void notifyWhatchers() { 
    for (IWatcher watcher : list) { 
      watcher.update(); 
    } 
  } 
   
  @Override 
  public void update() { 
    System.out.println("目標(biāo)更新中...."); 
    notifyWhatchers(); 
  } 
 
} 


監(jiān)聽器是觀察者的一種實現(xiàn):
類圖

201642495137152.jpg (780×502)

/** 
 * 監(jiān)聽 用戶在注冊后 
 * @author stone 
 * 
 */ 
public interface IRegisterListener { 
  void onRegistered(); 
} 

/** 
 * 監(jiān)聽 當(dāng)用戶登錄后 
 * @author stone 
 * 
 */ 
public interface ILoginListener { 
  void onLogined(); 
} 

/* 
 * 監(jiān)聽器 是觀察者模式的一種實現(xiàn) 
 * 一些需要監(jiān)聽的業(yè)務(wù)接口上添加 監(jiān)聽器,調(diào)用監(jiān)聽器的相應(yīng)方法,實現(xiàn)監(jiān)聽 
 */ 
public class User { 
   
  public void register(IRegisterListener register) { 
    /* 
     * do ... register 
     */ 
    System.out.println("正在注冊中..."); 
    //注冊后 
    register.onRegistered(); 
  } 
 
  public void login(ILoginListener login) { 
    /* 
     * do ... login 
     */ 
    System.out.println("正在登錄中..."); 
    //登錄后 
    login.onLogined(); 
  } 
 
} 


/** 
 * 觀察者(Observer)模式 行為型模式 
 *  觀察者模式定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時觀察某一個目標(biāo)對象。 
 *  這個目標(biāo)對象在狀態(tài)上發(fā)生變化時,會通知所有觀察者對象,讓它們能夠自動更新自己 
 * 目標(biāo)對象中需要有添加、移除、通知 觀察者的接口 
 *  
 * @author stone 
 */ 
public class Test { 
   
  public static void main(String[] args) { 
    /* 
     * 使用Java自帶的Observer接口和Observable類 
     */ 
    UpdateObservable observable = new UpdateObservable(new UpdateObserver()); 
    observable.setData(99); 
    System.out.println(""); 
    System.out.println(""); 
    /* 
     * 自定義的觀察者模型 
     */ 
    IWatchedSubject watched = new UpdateWatchedSubject(); 
    watched.add(new UpdateWatcher()); 
    watched.add(new UpdateWatcher()); 
    watched.update(); 
    System.out.println(""); 
     
    /* 
     * 子模式-監(jiān)聽器 
     */ 
     
    User user = new User(); 
    user.register(new IRegisterListener() { 
       
      @Override 
      public void onRegistered() { 
        System.out.println("監(jiān)聽到注冊后。。。"); 
      } 
    }); 
    user.login(new ILoginListener() { 
       
      @Override 
      public void onLogined() { 
        System.out.println("監(jiān)聽到登錄后。。。"); 
      } 
    }); 
     
  } 
} 


打印

接收到數(shù)據(jù)變化的通知: 
數(shù)據(jù)變更為:99 
 
目標(biāo)更新中.... 
observer.UpdateWatcher@457471e0觀察到:目標(biāo)已經(jīng)更新了 
observer.UpdateWatcher@5fe04cbf觀察到:目標(biāo)已經(jīng)更新了 
 
正在注冊中... 
監(jiān)聽到注冊后。。。 
正在登錄中... 
監(jiān)聽到登錄后。。。 

相關(guān)文章

  • Swing常用組件之多行文本區(qū)JTextArea

    Swing常用組件之多行文本區(qū)JTextArea

    這篇文章主要為大家詳細(xì)介紹了Swing常用組件之多行文本區(qū)JTextArea,感興趣的朋友可以參考一下
    2016-05-05
  • SpringBoot項目application.yml文件數(shù)據(jù)庫配置密碼加密的方法

    SpringBoot項目application.yml文件數(shù)據(jù)庫配置密碼加密的方法

    這篇文章主要介紹了SpringBoot項目application.yml文件數(shù)據(jù)庫配置密碼加密的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Spring Boot集成Swagger2項目實戰(zhàn)

    Spring Boot集成Swagger2項目實戰(zhàn)

    在日常的工作中,我們往往需要給前端(WEB端、IOS、Android)或者第三方提供接口,這個時候我們就需要給他們提供一份詳細(xì)的API說明文檔。這篇文章我們就來分享一種API文檔維護(hù)的方式,即通過Swagger來自動生成Restuful API文檔
    2018-01-01
  • Java實現(xiàn)替換集合中的元素的方法詳解

    Java實現(xiàn)替換集合中的元素的方法詳解

    這篇文章主要為大家詳細(xì)介紹了Java中實現(xiàn)替換集合中的元素的常見方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • Java調(diào)用linux shell腳本的方法

    Java調(diào)用linux shell腳本的方法

    這篇文章主要介紹了Java調(diào)用linux shell腳本的方法,需要的朋友可以參考下
    2015-02-02
  • 聊聊mybatis sql的括號問題

    聊聊mybatis sql的括號問題

    這篇文章主要介紹了mybatis sql的括號問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java實現(xiàn)synchronized鎖同步機(jī)制

    Java實現(xiàn)synchronized鎖同步機(jī)制

    synchronized是java內(nèi)置的同步鎖實現(xiàn),本文就詳細(xì)的介紹一下Java實現(xiàn)synchronized鎖同步機(jī)制,具有一定的參考價值,感興趣的可以了解一下
    2021-11-11
  • 解決HttpServletRequest 流數(shù)據(jù)不可重復(fù)讀的操作

    解決HttpServletRequest 流數(shù)據(jù)不可重復(fù)讀的操作

    這篇文章主要介紹了解決HttpServletRequest 流數(shù)據(jù)不可重復(fù)讀的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java讀取文件和寫入文件的方式(簡單實例)

    java讀取文件和寫入文件的方式(簡單實例)

    下面小編就為大家?guī)硪黄猨ava讀取文件和寫入文件的方式(簡單實例)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • Java @Deprecated注解的作用及傳遞性

    Java @Deprecated注解的作用及傳遞性

    用 @Deprecated注解的程序元素,不鼓勵程序員使用這樣的元素,通常是因為它很危險或存在更好的選擇,本文給大家介紹java @deprecated注解的作用及傳遞性,對本文感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12

最新評論