<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 24  文章 - 6  trackbacks - 0
    <2005年3月>
    272812345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    隨筆分類(23)

    積分與排名

    • 積分 - 13760
    • 排名 - 2082

    最新評論

    使用觀察者(Observer)實現對象監聽

    Bromon原創 請尊重版權

           有非常多的時候,我們希望自己的程序能夠監視數據的變化,然后做出響應,這種情況非常多,比如探測數據庫中數據的變化、檢測用戶狀態的變化等等。通常我們都缺乏一種雙工通信的機制,只能選擇讓程序做論詢,隔一段時間檢測一次數據變化,記錄下來與上一次檢測結果做對比,從而判斷數據是否發生了變化。毫無疑問這樣的方式很笨拙,不僅寫起來痛苦,跑起來也耗資源,是典型的用80%的時間解決20%的問題。

           觀察者(Observer)是一種模式,也是Java中的一個API,它讓一個值對象(Value Object)具備自省的功能,當他發現自己的狀態改變了,就向相關的對象發送消息,這樣的監聽方式當然比輪詢好。我感冒了自己會去醫院,用不著醫生每個月來問一次。禽獸·宇楓曾經給了我一段麻將游戲的服務器端代碼,本來是讓我研究一下麻將的算法,但是卻被其中Observer的使用所吸引,這樣寫出來的服務器執行效率很高。我曾經用線程池+反射+觀察者寫了一個即時消息的服務器,既有socket的方便也具備udp的高效,可惜后來因為大幅修改設計代碼作廢了,不過觀察者還是值得研究。

           JavaObserver API是對觀察者模式的一個實現。假設我們有一個對象容器,其中存放用戶消息,我希望這個容器自省,當有新的消息進來就自動觸發觀察者作出響應。首先定義消息對象,是個很簡單的值對象:

    package com.gwnet.smsMessenger.mm.bromon; 

    public class
     Message 

        
    private int
     id; 
        
    private
     String sender; 
        
    private
     String receiver; 
        
    private
     String content; 
        
    private
     String time; 
        
    //請自己實現set/get方法

    }
     


    然后寫一個存放Message的容器,容器使用ArrayList來存放對象是個很好的選擇,也很簡單:

    /* 
    * Created on 2004-8-11 
    */
     
    package com.gwnet.smsMessenger.mm.bromon; 
    import java.util.
    *

    /*
    * @author Bromon 
    */
     
    public class
     MessageList extends Observable 

        
    private List m=new
     ArrayList(); 
        
    private static MessageList ml=null


        
    public
     MessageList() 
        

        }
     

        
    public static
     MessageList getInstance() 
        

            
    if(ml==null

           

               ml
    =new
     MessageList(); 
           }
     
            
    return
     ml; 
        }
     

        
    public void
     add(Message msg) 
        

            m.add(msg); 
            super.setChanged(); 
            super.notifyObservers(m); 
        }
     

        
    public void
     del(Message msg) 
        

            m.remove(msg); 
        }
     
    }
     

      這個類繼承了Observable類,并且對其中的add方法做了手腳,很明顯,add方法的作用是向ArrayList容器中放入一個對象,這正是我們想監聽的操作,所以有了:

    uper.setChanged();

    super.notifyObservers(m);

      這意思是一旦調用add方法,這個類自己就會向所有注冊過的觀察者發送消息,消息內容是什么呢?內容就是m,是存放消息的容器,觀察者可以收到這個改變了狀態的容器,然后對它進行操作,從而實現了對容器的監聽,當然,我們只實現了對add方法的監聽,你也可以試試其他的。

      需要特別注意的是這是一個不完整的單例類,寫成單例是為了要保證整個jvm中只有這一個存放消息的容器,而不寫成完整的單例,原因是將來可能要提供另外的實例化方法。所以理解起來可能稍微難一點,大家可以參考一下設計模式中的單例模式。

    下面就是編寫觀察者并且注冊它:

    /* 
    * Created on 2004-8-11 
    */
     
    package com.gwnet.smsMessenger.bromon; 
    import java.util.
    *

    /*
    * @author Bromon 
    */
     
    public class
     MessageObserver implements Observer 

        
    /* (non-Javadoc) 
         * @see java.util.Observer#update(java.util.Observable, java.lang.Object) 
         
    */
     
        
    public void
     update(Observable arg0, Object arg1) 
        

           List l
    =
    (List)arg1; 
            Message m
    =(Message)l.get(l.size()-1
    ); 
            String receiver
    =
    m.getReceiver(); 
            System.
    out.println(""+m.getReceiver()+”的新消息:”+
    m.getContent()); 
        }
     
    }
     

      這個類繼承Oberver接口,update(Observable,Object)是必須提供的方法,在這個方法中我們接收被觀察類傳過來的數據(含有消息的容器),然后取出其中最后一個,讀取它的內容。

      Java里的觀察者使用起來是非常簡單的。我們的例子好處是所有的操作都在內存中進行,而且不需要輪詢,效率非常高,缺點是一旦當機內存中的數據就丟失了,所以如果有一套比較完善的對象緩沖機制,就可以應付復雜的應用,寫出高效簡潔的多線程服務器。

    posted on 2005-03-28 13:52 Sometimes Java 閱讀(1052) 評論(0)  編輯  收藏 所屬分類: Tech Flow
    主站蜘蛛池模板: 色综合久久精品亚洲国产| 大学生高清一级毛片免费| 麻豆va在线精品免费播放| 老汉色老汉首页a亚洲| 亚洲男人av香蕉爽爽爽爽| 免费中文熟妇在线影片| 全免费a级毛片免费看| 岛国精品一区免费视频在线观看| 亚洲精品乱码久久久久蜜桃| 亚洲精品国产成人| 久久久久亚洲精品美女| 国产亚洲精品精品国产亚洲综合| 免费看无码自慰一区二区| 免费v片在线观看视频网站| 久久狠狠躁免费观看2020| a级毛片免费网站| 四虎影视永久在线精品免费| 国产偷国产偷亚洲清高APP| 亚洲偷偷自拍高清| 亚洲精品视频观看| 久久丫精品国产亚洲av不卡| 国产V亚洲V天堂无码| 亚洲精品美女久久久久99| 国产亚洲精品不卡在线| 亚洲欭美日韩颜射在线二| 亚洲美女在线国产| 亚洲精品尤物yw在线影院| 大胆亚洲人体视频| 亚洲高清免费视频| 亚洲AV无码一区二三区 | 亚洲视频日韩视频| 亚洲综合成人网在线观看| 国产亚洲精品自在久久| 亚洲精品制服丝袜四区| 国产亚洲精品久久久久秋霞| 国产成人精品久久亚洲| 亚洲人成中文字幕在线观看| 亚洲国产成人精品无码区在线观看| 亚洲爆乳无码专区| 一区二区三区亚洲| 亚洲无圣光一区二区|