程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 詳解Java編程的Observer不雅察者設計形式

詳解Java編程的Observer不雅察者設計形式

編輯:關於JAVA

詳解Java編程的Observer不雅察者設計形式。本站提示廣大學習愛好者:(詳解Java編程的Observer不雅察者設計形式)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解Java編程的Observer不雅察者設計形式正文


 java說話裡包括了很多對設計形式的直接支撐,如command形式,agent形式,observer形式等。固然java供給的對這些形式的支撐很簡略,不克不及知足比擬龐雜的運用。但在簡略的場景下,應用這些類常常可以或許獲得吹糠見米的後果。所以,假如沒有甚麼特別需求,照樣最好應用java的這些類。
        Observer形式,又稱監聽形式,不雅察者形式,是經典設計形式之一(one of GOF)。java說話中,對這類形式支撐的類和接口重要有以下幾個,全體來自java.beans包:

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

      這是一個接口,很明顯,一切完成這個接口的類就是listener啦(或許叫observer),它會對被監聽的對象的某些變更感興致。這個接口就一個辦法:

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

接口界說很簡略,感化也很顯著。接收一個event(被監聽者發生的PropertyChangeEvent),然後依據這個event做點反響。

 java.beans.PropertyChangeSupport 

         這個類用在被不雅察者的類裡,用來保留注冊的不雅察者,並擔任向他們供給被不雅察者的變更信息。這個類的辦法也不多,不外照樣只引見100%用到的,要不頭腦就不敷使了,呵呵。

public PropertyChangeSupport(Object sourceBean) 

      這是結構函數,參數就是被監聽者。PropertyChangeListener普通作為被監聽者的一個屬性。普通以下應用:

private PropertyChangeSupport listeners = new PropertyChangeSupport(this); 

 
      留意,這個listeners可不是只代表一個監聽者,他能夠是一群監聽者。那末若何這些listeners是誰呢?這回用到上面的辦法了。

public void addPropertyChangeListener(PropertyChangeListener listener) 

        這個類太輕易了,把監聽者加出去。就像開十七年夜一樣,記者想要采訪,就得先掛號一下。明顯這個辦法可以屢次挪用(add嘛)。有加就有減:

public void removePropertyChangeListener(PropertyChangeListener listener) 

假如這個監聽者對被監聽者的任何變更多不感興致了,就被被監聽者趕了出去。
好了,記者都到齊了,被監聽者有變更了就該告訴人家了,應用以下辦法的一個:

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就是轉變前後的值,第一個就是給轉變一個名字,好讓監聽者們依據這個名子來做呼應。就像閉會,當局的一切信息都邑被記者聽到,然則有的記者只對台灣成績感興致,而有的記者對中日成績感興致。
對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辦法的履行。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved