亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Java編程的Observer觀察者設(shè)計(jì)模式

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

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

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

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

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

接口定義很簡(jiǎn)單,作用也很明顯。接受一個(gè)event(被監(jiān)聽(tīng)者產(chǎn)生的PropertyChangeEvent),然后根據(jù)這個(gè)event做點(diǎn)反應(yīng)。

 java.beans.PropertyChangeSupport 

         這個(gè)類用在被觀察者的類里,用來(lái)保存注冊(cè)的觀察者,并負(fù)責(zé)向他們提供被觀察者的變化信息。這個(gè)類的方法也不多,不過(guò)還是只介紹100%用到的,要不腦子就不夠使了,呵呵。

public PropertyChangeSupport(Object sourceBean) 

      這是構(gòu)造函數(shù),參數(shù)就是被監(jiān)聽(tīng)者。PropertyChangeListener一般作為被監(jiān)聽(tīng)者的一個(gè)屬性。一般如下使用:

private PropertyChangeSupport listeners = new PropertyChangeSupport(this); 

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

public void addPropertyChangeListener(PropertyChangeListener listener) 

        這個(gè)類太容易了,把監(jiān)聽(tīng)者加進(jìn)來(lái)。就像開(kāi)十七大一樣,記者想要采訪,就得先登記一下。顯然這個(gè)方法可以多次調(diào)用(add嘛)。有加就有減:

public void removePropertyChangeListener(PropertyChangeListener listener) 

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

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) 

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

java.beans.PropertyChangeEvent

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

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

就者三個(gè)類,再有就是具體問(wèn)題具體分析了。來(lái)個(gè)例子吧,首先是被觀察者:

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);  
  }  
} 

有人對(duì)Domain的三個(gè)屬性感興趣。下面就是這些人中的一個(gè):

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

下面是個(gè)簡(jiǎn)單的測(cè)試類:

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í)行。

相關(guān)文章

  • SpringMVC實(shí)現(xiàn)自定義類型轉(zhuǎn)換器

    SpringMVC實(shí)現(xiàn)自定義類型轉(zhuǎn)換器

    本篇文章主要介紹了SpringMVC實(shí)現(xiàn)自定義類型轉(zhuǎn)換器 ,詳細(xì)的介紹了自定義類型轉(zhuǎn)換器的用法和好處,有興趣的可以了解一下。
    2017-04-04
  • 5分鐘快速了解String.trim()到底做了什么事

    5分鐘快速了解String.trim()到底做了什么事

    trim方法一般用來(lái)去除空格,但是根據(jù)JDK API的說(shuō)明,該方法并不僅僅是去除空格,它能夠去除從編碼'\u0000'至'\u0020'的所有字符,這篇文章主要給大家介紹了如何通過(guò)5分鐘快速了解String.trim()到底做了什么事,需要的朋友可以參考下
    2021-11-11
  • 詳解MyBatis 常用寫法

    詳解MyBatis 常用寫法

    MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。這篇文章給大家介紹了MyBatis 常用寫法,感興趣的朋友跟隨小編一起看看吧
    2018-11-11
  • SpringBoot項(xiàng)目Pom文件的基本配置方式

    SpringBoot項(xiàng)目Pom文件的基本配置方式

    這篇文章主要介紹了SpringBoot項(xiàng)目Pom文件的基本配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • java中堆和棧的區(qū)別分析

    java中堆和棧的區(qū)別分析

    這篇文章主要介紹了java中堆和棧的區(qū)別,分析了Java中堆和棧的原理及使用時(shí)的注意事項(xiàng),需要的朋友可以參考下
    2014-09-09
  • Java輸出打印工具類封裝的實(shí)例

    Java輸出打印工具類封裝的實(shí)例

    下面小編就為大家?guī)?lái)一篇Java輸出打印工具類封裝的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • SpringBoot在項(xiàng)目中訪問(wèn)靜態(tài)資源步驟分析

    SpringBoot在項(xiàng)目中訪問(wèn)靜態(tài)資源步驟分析

    今天在玩SpringBoot的demo的時(shí)候,放了張圖片在resources目錄下,啟動(dòng)區(qū)訪問(wèn)的時(shí)候,突然好奇是識(shí)別哪些文件夾來(lái)展示靜態(tài)資源的, 為什么有時(shí)候放的文件夾不能顯示,有的卻可以
    2023-01-01
  • Java FileInputStream讀中文亂碼問(wèn)題解決方案

    Java FileInputStream讀中文亂碼問(wèn)題解決方案

    這篇文章主要介紹了Java FileInputStream讀中文亂碼問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • javaWeb使用驗(yàn)證碼實(shí)現(xiàn)簡(jiǎn)單登錄

    javaWeb使用驗(yàn)證碼實(shí)現(xiàn)簡(jiǎn)單登錄

    這篇文章主要為大家詳細(xì)介紹了javaWeb使用驗(yàn)證碼實(shí)現(xiàn)簡(jiǎn)單登錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java 漢字獲取拼音或首字母工具類代碼分析

    Java 漢字獲取拼音或首字母工具類代碼分析

    在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于Java 漢字獲取拼音或首字母工具類知識(shí)點(diǎn)內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。
    2021-06-06

最新評(píng)論