細心!用心!耐心!

          吾非文人,乃市井一俗人也,讀百卷書,跨江河千里,故申城一游; 一兩滴辛酸,三四年學業(yè),五六點粗墨,七八筆買賣,九十道人情。

          BlogJava 聯(lián)系 聚合 管理
            1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks
          假設(shè)今天您設(shè)計一個試算表程式,當中有一個資料物件,您可以用表格圖形物件、柱狀圖形物件、圓餅圖形物件等方式來呈現(xiàn)物件,無論您是用哪種圖形物件,重點是若資料物件的內(nèi)容作了更改,則圖形物件的內(nèi)容也必須跟著修改,或許您的程式中有兩個以上的圖形物件來呈現(xiàn)資料,您在圖形物件上更動資料,則另一個圖形物件也必須作出相對應(yīng)的變化。
          主題 資料物件
          觀察者 柱狀圖形 表格圖形 圓餅圖形


          又假設(shè)您今天設(shè)計一個網(wǎng)路遊戲,您在伺服器上維護一個連線客戶端共享的資料物件,當其中一個客戶端作了操作,將對此資料物件作修改,則伺服器必須通知其它客戶端作相對應(yīng)的變化(像是人物位置走動、建了一個城堡等)。
          主題 資料物件
          觀察者 客戶端一 客戶端二 客戶端三


          在Observer模式中的主角為主題(subject)與觀察者(observer),觀察者訂閱它感興趣的主題,一個主題可以被多個觀察者訂閱,當主題的狀態(tài)發(fā)生變化時,它必須通知(notify)所有訂閱它的觀察者,觀察者檢視主題的狀態(tài)變化,並作出對應(yīng)的動作,所以O(shè)bserver 模式也稱之為Publish-Subscribe模式。

          Observer模式的 UML 圖如下所示:
          Observer

          Subject類中有一個notify()方法,通常是在Subject的狀態(tài)發(fā)生改變時呼叫它,notify()中會呼叫 Observer的update()方法,通常會先取得Subject的新狀態(tài),然後更新Observer的顯示或行為,這個過程我們可以透過 Sequence Diagram來表達:
          Observer

          在Java中支援觀察者模式,要成為觀察者的類必須實作Observer介面,這個介面中定義了一個update()方法,這個方法會被主題物件在通知狀態(tài)變化時呼叫,您必須在這個方法中實作您所想要的對應(yīng)行為。

          主題物件會是Observable的子類,在這邊注意兩個重要的方法:setChanged()與notifyObserver()。 setChanged()是用來設(shè)定主題物件的狀態(tài)已經(jīng)被改變,而notifyObserver()方法會通知所要訂閱主題物件的觀察者,調(diào)用其 update()方法。

          有興趣的話,建議看一下Java的Observable.java中是如何實作的,這有助於瞭解Observer模式的運作方式。
          posted on 2007-04-17 10:50 張金鵬 閱讀(273) 評論(0)  編輯  收藏 所屬分類: Behavioral 模式
          主站蜘蛛池模板: 团风县| 泗洪县| 长沙县| 雷山县| 永福县| 长宁区| 合川市| 疏附县| 孟州市| 建始县| 开阳县| 芦溪县| 德兴市| 尉氏县| 长兴县| 阜新市| 池州市| 红桥区| 甘肃省| 耒阳市| 赤峰市| 苗栗市| 泸西县| 汝南县| 盘山县| 青海省| 乐至县| 齐齐哈尔市| 乌兰县| 阳新县| 乌鲁木齐县| 郴州市| 五家渠市| 华安县| 余庆县| 图木舒克市| 丰城市| 郑州市| 青州市| 武功县| 叶城县|