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

詳解Java編程的Observer觀察者設計模式

 更新時間:2016年01月03日 16:48:48   作者:Willis Yang  
這篇文章主要介紹了Java編程的Observer觀察者設計模式,觀察者模式定義了一個一對多的依賴關系,讓一個或多個觀察者對象監(jiān)察一個主題對象,需要的朋友可以參考下

 java語言里包含了許多對設計模式的直接支持,如command模式,agent模式,observer模式等。雖然java提供的對這些模式的支持很簡單,不能滿足比較復雜的應用。但在簡單的場景下,使用這些類往往能夠得到立桿見影的效果。所以,如果沒有什么特殊需求,還是最好利用java的這些類。
        Observer模式,又稱監(jiān)聽模式,觀察者模式,是經典設計模式之一(one of GOF)。java語言中,對這種模式支持的類和接口主要有以下幾個,全部來自java.beans包:

java.beans.PropertyChangeListener (interface) 
java.beans.PropertyChangeSupport (class)
java.beans.PropertyChangeEvent (class)
java.beans.PropertyChangeListener

      這是一個接口,很顯然,所有實現(xiàn)這個接口的類就是listener啦(或者叫observer),它會對被監(jiān)聽的對象的某些變化感興趣。這個接口就一個方法:

public void propertyChange(PropertyChangeEvent evt) {  
// TODO Auto-generated method stub  
} 

接口定義很簡單,作用也很明顯。接受一個event(被監(jiān)聽者產生的PropertyChangeEvent),然后根據這個event做點反應。

 java.beans.PropertyChangeSupport 

         這個類用在被觀察者的類里,用來保存注冊的觀察者,并負責向他們提供被觀察者的變化信息。這個類的方法也不多,不過還是只介紹100%用到的,要不腦子就不夠使了,呵呵。

public PropertyChangeSupport(Object sourceBean) 

      這是構造函數,參數就是被監(jiān)聽者。PropertyChangeListener一般作為被監(jiān)聽者的一個屬性。一般如下使用:

private PropertyChangeSupport listeners = new PropertyChangeSupport(this); 

 
      注意,這個listeners可不是只代表一個監(jiān)聽者,他可能是一群監(jiān)聽者。那么如何這些listeners是誰呢?這回用到下面的方法了。

public void addPropertyChangeListener(PropertyChangeListener listener) 

        這個類太容易了,把監(jiān)聽者加進來。就像開十七大一樣,記者想要采訪,就得先登記一下。顯然這個方法可以多次調用(add嘛)。有加就有減:

public void removePropertyChangeListener(PropertyChangeListener listener) 

如果這個監(jiān)聽者對被監(jiān)聽者的任何變化多不感興趣了,就被被監(jiān)聽者趕了出去。
好了,記者都到齊了,被監(jiān)聽者有變化了就該通知人家了,使用如下方法的一個:

public void firePropertyChange(PropertyChangeEvent evt)  
 
public void firePropertyChange(String propertyName,  
                boolean oldValue,  
                boolean newValue)  
 
public void firePropertyChange(String propertyName,  
                int oldValue,  
                int newValue)  
 
public void firePropertyChange(String propertyName,  
                Object oldValue,  
                Object newValue) 

實際上,后三個方法的參數都會封裝成PropertyChangeEvent,然后調用第一個方法。不過在實際中,我們還是喜歡直接調用后三個中的一個,封裝的事我們就不管了。后三個方法的參數都是三個,其中的oldValue和newValue就是改變前后的值,第一個就是給改變一個名字,好讓監(jiān)聽者們根據這個名子來做響應。就像開會,政府的所有信息都會被記者聽到,但是有的記者只對臺灣問題感興趣,而有的記者對中日問題感興趣。
對PropertyChangeSupport方法的介紹就這么多吧。注意,PropertyChangeSupport既然被用到了被觀察者的類(一般是一個model)里,那么他的這些方法就只在被觀察這里調用。

java.beans.PropertyChangeEvent

       這個類我也懶得介紹,看看他的主要方法就明白怎么回事了

public String getPropertyName()  
public Object getNewValue()  
public Object getOldValue() 

就者三個類,再有就是具體問題具體分析了。來個例子吧,首先是被觀察者:

public class Domain{  
  protected String id;  
  protected String name;  
  protected String desName;  
 
  protected PropertyChangeSupport listeners = new PropertyChangeSupport(this);  
 
  public String getId() {  
    return id;  
  }  
 
  public void setId(String id) {  
    this.id = id;  
    firePropertyChange("Domain.id", null, id);  
  }  
 
  public String getDesName() {  
    return desName;  
  }  
 
  public void setDesName(String desName) {  
    this.desName = desName;  
    firePropertyChange("Domain.desName", null, desName);  
  }  
 
  public String getName() {  
    return name;  
  }  
 
  public void setName(String name) {  
    this.name = name;  
    firePropertyChange("Domain.name", null, name);  
  }  
 
  public void addPropertyChangeListener(PropertyChangeListener listener) {  
    listeners.addPropertyChangeListener(listener);  
  }  
 
  public void firePropertyChange(String propName, Object oldValue, Object newValue) {  
    listeners.firePropertyChange(propName, oldValue, newValue);  
  }  
 
  public void removePropertyChangeListener(PropertyChangeListener listener) {  
    listeners.removePropertyChangeListener(listener);  
  }  
} 

有人對Domain的三個屬性感興趣。下面就是這些人中的一個:

public class SimpleObserver implements PropertyChangeListener {  
    
  ....  
    
  @Override 
  public void propertyChange(PropertyChangeEvent evt) {  
    if(evt.getPropertyName().equals("Domain.name")){  
      //do some work  
    }  
  }  
    
} 

下面是個簡單的測試類:

public class SimpleTest{  
  public static void main(String[] args) {  
    SimpleObserver observer = new SimpleObserver();  
    Domain domain = new Domain();  
    domain.addPropertyChangeListener(observer);  
    domain.setName("yangsq");  
    ......  
  }  
} 

很顯然,可以觀察到SimpleObserver中propertyChange方法的執(zhí)行。

相關文章

  • Java Swing實現(xiàn)簡單的體重指數(BMI)計算器功能示例

    Java Swing實現(xiàn)簡單的體重指數(BMI)計算器功能示例

    這篇文章主要介紹了Java Swing實現(xiàn)簡單的體重指數(BMI)計算器功能,涉及Java Swing窗口組件布局、響應及數值運算相關操作技巧,需要的朋友可以參考下
    2017-12-12
  • Java生成獨一無二的工單號實例

    Java生成獨一無二的工單號實例

    這篇文章主要介紹了Java生成獨一無二的工單號實例,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Spring用三級緩存處理循環(huán)依賴的方法詳解

    Spring用三級緩存處理循環(huán)依賴的方法詳解

    這篇文章主要介紹了Spring用三級緩存處理循環(huán)依賴的方法,在Spring?框架中,依賴注入是其核心特性之一,它允許對象之間的依賴關系在運行時動態(tài)注入,然而,當多個Bean之間的依賴關系形成一個閉環(huán)時,就會出現(xiàn)循環(huán)依賴問題,本文就為解決此問題,需要的朋友可以參考下
    2025-02-02
  • Java實現(xiàn)大文件的切割與合并操作示例

    Java實現(xiàn)大文件的切割與合并操作示例

    這篇文章主要介紹了Java實現(xiàn)大文件的切割與合并操作,結合實例形式分析了java基于io及util操作大文件按指定個數分割與合并相關操作技巧,需要的朋友可以參考下
    2018-07-07
  • Eclipse將Maven項目打成jar包的方法

    Eclipse將Maven項目打成jar包的方法

    這篇文章主要介紹了Eclipse將Maven項目打成jar包的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2007-09-09
  • Java實現(xiàn)簡單的迷宮游戲詳解

    Java實現(xiàn)簡單的迷宮游戲詳解

    迷宮游戲作為經典的小游戲,一直深受大家的喜愛。本文小編將為大家詳細介紹一下如何用Java實現(xiàn)一個簡單的迷宮小游戲,感興趣的可以動手試一試
    2022-02-02
  • java實現(xiàn)時間與字符串之間轉換

    java實現(xiàn)時間與字符串之間轉換

    這篇文章主要為大家詳細介紹了java實現(xiàn)時間與字符串之間轉換,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • java中的DTO的使用示例

    java中的DTO的使用示例

    在Java中,DTO代表數據傳輸對象,本文主要介紹了java中的DTO的使用示例,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • mybatis.type-aliases-package的作用及用法說明

    mybatis.type-aliases-package的作用及用法說明

    這篇文章主要介紹了mybatis.type-aliases-package的作用及用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • sin(x)如何求解的java代碼實現(xiàn)方法

    sin(x)如何求解的java代碼實現(xiàn)方法

    這篇文章主要為大家介紹了sin(x)如何求解的java代碼實現(xiàn)方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04

最新評論

华宁县| 高邮市| 永川市| 天台县| 盐边县| 恩平市| 西和县| 耿马| 聂拉木县| 繁峙县| 南投县| 达州市| 庐江县| 互助| 双峰县| 大城县| 资阳市| 昌图县| 广汉市| 承德市| 嫩江县| 永靖县| 鄂尔多斯市| 彭水| 南平市| 麻栗坡县| 翁源县| 郧西县| 横山县| 长阳| 南城县| 监利县| 台江县| 新巴尔虎右旗| 崇明县| 东城区| 南投市| 芒康县| 剑河县| 壤塘县| 芜湖县|