詳解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辦法的履行。