• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 200, comments - 8, trackbacks - 0, articles - 0

            Java Observable 模式(轉(zhuǎn))

            Posted on 2012-09-26 14:30 鑫龍 閱讀(320) 評論(0)  編輯 收藏 引用 所屬分類: 設(shè)計模式

            一、Observer模式的意圖:

                            在對象的內(nèi)部狀態(tài)發(fā)生變化時,自動通知外部對象進(jìn)行響應(yīng)。

            二、Observer模式的構(gòu)成:

                           ·被觀察者:內(nèi)部狀態(tài)有可能被改變,而且又需要通知外部的對象

                           ·觀察者:需要對內(nèi)部狀態(tài)的改變做出響應(yīng)的對象

            三、Observer模式的Java實(shí)現(xiàn):

                            Java的API中已經(jīng)為我們提供了Observer模式的實(shí)現(xiàn)。具體由java.util.Observable類和java.util.Observer接口完成。

                            前者有兩個重要的方法:

                                   ·setChanged:設(shè)置內(nèi)部狀態(tài)為已改變

                                   ·notifyObservers(Object obj):通知觀察者所發(fā)生的改變,參數(shù)obj是一些改變的信息

                            后者有一個核心方法:

                                   ·update(Object obj):相應(yīng)被觀察者的改變,其中obj就是被觀察者傳遞過來的信息,該方法會在notifyObservers被調(diào)用時自動調(diào)用。

                          下面是Observer模式的實(shí)現(xiàn)過程:

                                 ·創(chuàng)建一個被觀察者,繼承java.util.Observable

                                 ·創(chuàng)建一個觀察者,實(shí)現(xiàn)java.util.Observer接口

                                · 注冊觀察著,調(diào)用addObserver(Observer observer)

                                ·在被觀察者改變對象內(nèi)部狀態(tài)的地方,調(diào)用setChanged()方法,然后調(diào)用notifyObservers(Object)方法,通知被觀察者

                               ·在觀察者的update(Object)方法中,對改變做出響應(yīng)。

            四、Observer模式的好處:

                             1.Observer模式的優(yōu)點(diǎn):

                                   ·被觀察者只需要知道誰在觀察它,無需知道具體的觀察細(xì)節(jié)

                                   ·被觀察者一旦發(fā)生變化,只需要通過廣播的方式告知觀察者,至于消息如何到達(dá)則不需知道。這樣的話無疑消除了被觀察者和觀察者之間通信的硬編碼

                                   ·當(dāng)一個被觀察者同時被多個觀察著觀察時,觀察者可以只選擇自己感興趣的事件,而忽略其它的事件
               
                                  ·多個觀察者組合起來可以形成一個觀察鏈,如果一旦需要回滾多個操作,此時觀察鏈可以發(fā)揮作用

                                  ·觀察者可以實(shí)時對被觀察對象的變化做出響應(yīng),例如自動告警、中斷運(yùn)行等


                            2.運(yùn)用Observer模式可以

                                 ·屏蔽線程間的通信機(jī)制:例如兩個線程之間,主線程可以作為觀察者,執(zhí)行線程是被觀察者。彼此之間只知道對方存在,但不知道之間通信的細(xì)節(jié)

                                ·消除硬編碼:如果沒有Observer模式,則只能采用回調(diào)的模式,或者在代碼中顯示地調(diào)用觀察者

                                ·優(yōu)化異常機(jī)制:特別適合在異常發(fā)生時向頂層監(jiān)控,減少try-catch代碼量

            代碼:

             

            1. public class Observable {      
            2.     private boolean changed = false;      
            3.     private Vector obs;      
            4.          
            5.     //創(chuàng)建被觀察者時就創(chuàng)建一個它持有的觀察者列表,注意,這個列表是需要同步的。      
            6.     public Observable() {      
            7.     obs = new Vector();      
            8.     }      
            9.      
            10.     /**    
            11.      * 添加觀察者到觀察者列表中去    
            12.      */     
            13.     public synchronized void addObserver(Observer o) {      
            14.         if (o == null)      
            15.             throw new NullPointerException();      
            16.     if (!obs.contains(o)) {      
            17.         obs.addElement(o);      
            18.     }      
            19.     }      
            20.      
            21.     /**    
            22.      * 刪除一個觀察者    
            23.      */     
            24.     public synchronized void deleteObserver(Observer o) {      
            25.         obs.removeElement(o);      
            26.     }      
            27.      
            28.     /**    
            29.      * 通知操作,即被觀察者發(fā)生變化,通知對應(yīng)的觀察者進(jìn)行事先設(shè)定的操作,不傳參數(shù)的通知方法    
            30.      */     
            31.     public void notifyObservers() {      
            32.     notifyObservers(null);      
            33.     }      
            34.      
            35.     /**    
            36.      * 與上面的那個通知方法不同的是,這個方法接受一個參數(shù),這個參數(shù)一直傳到觀察者里,以供觀察者使用    
            37.      */     
            38.     public void notifyObservers(Object arg) {      
            39.           
            40.         Object[] arrLocal;      
            41.      
            42.     synchronized (this) {      
            43.         if (!changed)      
            44.                 return;      
            45.             arrLocal = obs.toArray();      
            46.             clearChanged();      
            47.         }      
            48.      
            49.         for (int i = arrLocal.length-1; i>=0; i--)      
            50.             ((Observer)arrLocal[i]).update(this, arg);      
            51.     }      
            52. }     
            53. public interface Observer {      
            54.     /**    
            55.      * This method is called whenever the observed object is changed. An    
            56.      * application calls an <tt>Observable</tt> object's    
            57.      * <code>notifyObservers</code> method to have all the object's    
            58.      * observers notified of the change.    
            59.      *    
            60.      * @param   o     the observable object.    
            61.      * @param   arg   an argument passed to the <code>notifyObservers</code>    
            62.      *                 method.    
            63.      */     
            64.     void update(Observable o, Object arg);      
            65. }      
            66. }     
            67. public class MailObserver implements Observer{      
            68.      
            69.     /**    
            70.      * 這個類取名為MailObserver,顧名思義,她是一個用來發(fā)送郵件的觀察者    
            71.      */     
            72.     public void update(Observable o, Object arg) {      
            73.         System.out.println("發(fā)送郵件的觀察者已經(jīng)被執(zhí)行");      
            74.     }      
            75. }     
            76. public class JMSObserver implements Observer{      
            77.      
            78.     public void update(Observable o, Object arg) {      
            79.         System.out.println("發(fā)送消息給jms服務(wù)器的觀察者已經(jīng)被執(zhí)行");      
            80.     }      
            81. }     
            82. public class Subject extends Observable{      
            83.           
            84.     /**    
            85.      * 業(yè)務(wù)方法,一旦執(zhí)行某個操作,則通知觀察者    
            86.      */     
            87.     public void doBusiness(){      
            88.         if (true) {      
            89.             super.setChanged();      
            90.         }      
            91.         notifyObservers("現(xiàn)在還沒有的參數(shù)");      
            92.     }      
            93.      
            94.           
            95.     public static void main(String [] args) {      
            96.         //創(chuàng)建一個被觀察者      
            97.         Subject subject = new Subject();      
            98.               
            99.         //創(chuàng)建兩個觀察者      
            100.         Observer mailObserver = new MailObserver();      
            101.         Observer jmsObserver = new JMSObserver();      
            102.               
            103.         //把兩個觀察者加到被觀察者列表中      
            104.         subject.addObserver(mailObserver);      
            105.         subject.addObserver(jmsObserver);      
            106.               
            107.         //執(zhí)行業(yè)務(wù)操作      
            108.         subject.doBusiness();      
            109.     }      
            110. }    

             

             

            久久天天躁狠狠躁夜夜躁2014| 久久AV高清无码| 久久婷婷综合中文字幕| 69国产成人综合久久精品| 丁香五月网久久综合| 久久久久久国产精品无码下载| 国产精品一区二区久久精品涩爱| 无码久久精品国产亚洲Av影片| 久久er国产精品免费观看2| 久久强奷乱码老熟女网站| 波多野结衣中文字幕久久| 亚洲精品乱码久久久久久蜜桃| 少妇熟女久久综合网色欲| 亚洲国产精品久久久久婷婷软件 | 国内精品久久久久久不卡影院| 亚洲精品无码久久久久AV麻豆| 精品国产VA久久久久久久冰| 中文成人无码精品久久久不卡| 国产亚洲婷婷香蕉久久精品 | 狠狠色丁香久久婷婷综合图片| 久久精品国产秦先生| 久久久精品久久久久影院| 2022年国产精品久久久久| 国产成人精品久久| 国产高清国内精品福利99久久| 人妻无码αv中文字幕久久| 久久精品?ⅴ无码中文字幕| 狠狠色丁香久久综合婷婷| 99久久精品免费看国产一区二区三区| 国产午夜精品理论片久久 | 久久亚洲2019中文字幕| 久久精品国产亚洲一区二区三区| 久久久久久久尹人综合网亚洲| 久久精品国产亚洲精品2020| 久久精品国产99久久久古代 | 99久久婷婷国产综合精品草原| 中文国产成人精品久久不卡| 久久人做人爽一区二区三区| 2021国内精品久久久久久影院| 国产精品成人久久久| 狠狠色丁香婷婷久久综合|