一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - 詳解Java編程的Observer觀察者設(shè)計模式

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

2020-03-20 12:41Willis Yang JAVA教程

這篇文章主要介紹了Java編程的Observer觀察者設(shè)計模式,觀察者模式定義了一個一對多的依賴關(guān)系,讓一個或多個觀察者對象監(jiān)察一個主題對象,需要的朋友可以參考下

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

?
1
2
3
4
java.beans.PropertyChangeListener (interface)
java.beans.PropertyChangeSupport (class)
java.beans.PropertyChangeEvent (class)
java.beans.PropertyChangeListener

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

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

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

?
1
java.beans.PropertyChangeSupport

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

?
1
public PropertyChangeSupport(Object sourceBean)

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

?
1
private PropertyChangeSupport listeners = new PropertyChangeSupport(this);

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

?
1
public void addPropertyChangeListener(PropertyChangeListener listener)

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

?
1
public void removePropertyChangeListener(PropertyChangeListener listener)

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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í)際上,后三個方法的參數(shù)都會封裝成PropertyChangeEvent,然后調(diào)用第一個方法。不過在實(shí)際中,我們還是喜歡直接調(diào)用后三個中的一個,封裝的事我們就不管了。后三個方法的參數(shù)都是三個,其中的oldValue和newValue就是改變前后的值,第一個就是給改變一個名字,好讓監(jiān)聽者們根據(jù)這個名子來做響應(yīng)。就像開會,政府的所有信息都會被記者聽到,但是有的記者只對臺灣問題感興趣,而有的記者對中日問題感興趣。
對PropertyChangeSupport方法的介紹就這么多吧。注意,PropertyChangeSupport既然被用到了被觀察者的類(一般是一個model)里,那么他的這些方法就只在被觀察這里調(diào)用。

?
1
java.beans.PropertyChangeEvent

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

?
1
2
3
public String getPropertyName() 
public Object getNewValue() 
public Object getOldValue()

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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的三個屬性感興趣。下面就是這些人中的一個:

?
1
2
3
4
5
6
7
8
9
10
11
12
public class SimpleObserver implements PropertyChangeListener { 
    
  .... 
    
  @Override
  public void propertyChange(PropertyChangeEvent evt) { 
    if(evt.getPropertyName().equals("Domain.name")){ 
      //do some work 
    
  
    
}

下面是個簡單的測試類:

?
1
2
3
4
5
6
7
8
9
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í)行。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 小sao货水好多真紧h的视频 | 胖女性大bbbbbb | 日本高清在线观看天码888 | 国产拍拍视频一二三四区 | 日韩精品一区二区 | 国产乱妇无码大片在线观看 | 97大香伊在人人线色 | haodiaose在线精品免费视频 | 国内久久精品 | 亚洲精品一二三四 | 天天爽视频 | 国产人va在线 | 日韩欧美亚洲天堂 | jzzjzz视频免费播放 | 国产大秀视频一区二区三区 | 我的好妈妈7中字在线观看韩国 | 97爱sese| 第一福利在线视频 | 亚洲男人的天堂视频 | 狠狠澡| 欧美亚洲国产精品久久第一页 | 色综合久久综精品 | 日日综合 | 边摸边操| 天天综合色天天综合色sb | 爱情岛论坛亚洲品质自拍视频 | 国产剧情在线播放 | www.四色| 无人影院在线播放视频 | 午夜国产精品福利在线观看 | 日本公与妇中文在线 | 加勒比伊人 | 小辣椒精品福利视频导航 | 乳色吐息讲的是什么 | 欧美日韩国产在线人成 | 国产成人综合久久 | 亚洲精品福利一区二区在线观看 | xx欧美老妇| 日本视频高清 | 欧美成人精品第一区二区三区 | 暖暖在线精品日本中文 |