小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

設(shè)計(jì)模式-觀察者模式的JDK實(shí)現(xiàn)

 jl_oracle 2012-01-12

設(shè)計(jì)模式-觀察者模式的JDK實(shí)現(xiàn)

關(guān)鍵字: 設(shè)計(jì)模式
今天在翻查JAVA API的時(shí)候發(fā)現(xiàn)了特別的類java.util.Observable和接口
java.util.Observer,細(xì)看發(fā)現(xiàn)原來(lái)是java類庫(kù)實(shí)現(xiàn)觀察著(Observer)模式的類和接口。

觀察者模式定義:
觀察者(Observer)模式又名發(fā)布-訂閱(Publish/Subscribe)模式。GOF給觀察者模式如下定義:定義對(duì)象Observer間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。

Observable和Observer的說(shuō)明:
繼承于Observable的子類表示被觀察的對(duì)象,實(shí)現(xiàn)了接口Observer的類表示觀察者.在下面的例子中繼承于Observable的子類 NewsDispatcher(新聞派發(fā)器)表示被觀察的對(duì)象,在有新的新聞的時(shí)候會(huì)把新聞內(nèi)容派發(fā)給所有的訂閱者(Reader),Reader是實(shí)現(xiàn)了Observer接口的類表示讀者。

Observable的簡(jiǎn)單功能介紹:
addObserver(Observer o)  添加觀察著
clearChanged() 清除變化,則把“變化標(biāo)志”設(shè)為false
countObservers() 統(tǒng)計(jì)觀察著數(shù)量
deleteObserver(Observer o) 刪除觀察者
deleteObservers() 刪除所有的觀察者
hasChanged() 測(cè)試是否有變化(則返回“變化標(biāo)志”)
notifyObservers() 如果hasChanged()=ture,通知所有的觀察著(則調(diào)用Observer.update()方法)
notifyObservers(Object arg) 如果hasChanged()=ture,通知所有的觀察著(則調(diào)用Observer.update()方法),并把參數(shù)arg傳過(guò)去
setChanged() 設(shè)置變化,則把“變化標(biāo)志”設(shè)為true

Observable的簡(jiǎn)單功能介紹
update(Observable o, Object arg) Observable唯一的方法,在被通知時(shí)被Observable調(diào)用

例子代碼:
Java代碼
  1. package com.pasu.observer;   
  2.   
  3. import java.util.Observable;   
  4.   
  5. public class NewsDispatcher extends Observable   
  6. {   
  7.       
  8.     public void addNews(String news)   
  9.     {   
  10.         this.setChanged();   
  11.         this.notifyObservers(news);   
  12.     }   
  13.  
package com.pasu.observer;

import java.util.Observable;

public class NewsDispatcher extends Observable
{
        
        public void addNews(String news)
        {
                this.setChanged();
                this.notifyObservers(news);
        }
}


Java代碼
  1. package com.pasu.observer;   
  2.   
  3. import java.util.Observable;   
  4. import java.util.Observer;   
  5.   
  6. public class Reader implements Observer   
  7. {   
  8.     private String name;   
  9.        
  10.     public Reader(String name)   
  11.     {   
  12.         this.name name;   
  13.     }   
  14.        
  15.     @Override  
  16.     public void update(Observable o, Object arg)   
  17.     {   
  18.         String news (String)arg;   
  19.         System.out.println(name " news);   
  20.     }   
  21.   
  22.        
  23.  
package com.pasu.observer;

import java.util.Observable;
import java.util.Observer;

public class Reader implements Observer
{
        private String name;
        
        public Reader(String name)
        {
                this.name = name;
        }
        
        @Override
        public void update(Observable o, Object arg)
        {
                String news = (String)arg;
                System.out.println(name + " : " + news);
        }

        
}


Java代碼
  1. package com.pasu.observer;   
  2.   
  3. public class Test   
  4. {   
  5.     public static void main(String[] args)   
  6.     {   
  7.         //體育新聞派發(fā)器   
  8.         NewsDispatcher sportNewsDispatcher new NewsDispatcher();   
  9.         //it新聞派發(fā)器   
  10.         NewsDispatcher itNewsDispatcher new NewsDispatcher();   
  11.         //觀察者r1,r2,r3   
  12.         Reader r1 new Reader("r1");   
  13.         Reader r2 new Reader("r2");   
  14.         Reader r3 new Reader("r3");   
  15.         //添加觀察者   
  16.         sportNewsDispatcher.addObserver(r1);   
  17.         sportNewsDispatcher.addObserver(r2);   
  18.         itNewsDispatcher.addObserver(r3);   
  19.         //當(dāng)有新的新聞的時(shí)候,通知觀察者   
  20.         sportNewsDispatcher.addNews("中國(guó)隊(duì)突破了歷史獲得了世界杯冠軍!");   
  21.         itNewsDispatcher.addNews("ibm 收購(gòu) sun公司,java開始收費(fèi)!");    
  22.     }   
  23.  
package com.pasu.observer;

public class Test
{
        public static void main(String[] args)
        {
                //體育新聞派發(fā)器
                NewsDispatcher sportNewsDispatcher = new NewsDispatcher();
                //it新聞派發(fā)器
                NewsDispatcher itNewsDispatcher = new NewsDispatcher();
                //觀察者r1,r2,r3
                Reader r1 = new Reader("r1");
                Reader r2 = new Reader("r2");
                Reader r3 = new Reader("r3");
                //添加觀察者
                sportNewsDispatcher.addObserver(r1);
                sportNewsDispatcher.addObserver(r2);
                itNewsDispatcher.addObserver(r3);
                //當(dāng)有新的新聞的時(shí)候,通知觀察者
                sportNewsDispatcher.addNews("中國(guó)隊(duì)突破了歷史獲得了世界杯冠軍!");
                itNewsDispatcher.addNews("ibm 收購(gòu) sun公司,java開始收費(fèi)!");     
        }
}


Test類運(yùn)行輸出的結(jié)果
Java代碼
  1. r2 中國(guó)隊(duì)突破了歷史,獲得了世界杯冠軍!   
  2. r1 中國(guó)隊(duì)突破了歷史,獲得了世界杯冠軍!   
  3. r3 ibm 收購(gòu) sun公司,java開始收費(fèi)!  

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多