?? observerpattern.htm
字號:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="css/stdlayout.css" type="text/css">
<link rel="stylesheet" href="css/print.css" type="text/css">
<meta content="text/html; charset=gb2312" http-equiv="content-type">
<title>Observer 模式</title>
</head>
<body>
<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>
<h1><a href="CppGossip.html">Design Pattern: Observer 模式</a></h1>
假設(shè)今天您設(shè)計一個試算表程式,當(dāng)中有一個資料物件,您可以用表格圖形物件、柱狀圖形物件、圓餅圖形物件等方式來
呈現(xiàn)物件,無論您是用哪種圖形物件,重點
是若資料物件的內(nèi)容作了更改,則圖形物件的內(nèi)容也必須跟著修改,或許您的程式中有兩個以上的圖形物件來呈現(xiàn)資料,您在圖形物件上更動資料,則另一個圖形物
件也必須作出相對應(yīng)的變化。
<table align="center" border="1" width="50%">
<tbody>
<tr>
<td align="center" valign="top"><small> <strong>主題</strong> </small></td>
<td colspan="3" align="center" valign="top"><small> 資料物件 </small></td>
</tr>
<tr>
<td align="center" valign="top"><small> <strong>觀察者</strong> </small></td>
<td align="center" valign="top"><small> 柱狀圖形 </small></td>
<td align="center" valign="top"><small> 表格圖形 </small></td>
<td align="center" valign="top"><small> 圓餅圖形 </small></td>
</tr>
</tbody>
</table>
<br clear="all">
<br>
又假設(shè)您今天設(shè)計一個網(wǎng)路游戲,您在伺服器上維護一個連線客戶端共享的資料物件,當(dāng)其中一個客戶端作了操作,將對此資料物件作修改,則伺服器必須通知其它
客戶端作相對應(yīng)的變化(像是人物位置走動、建了一個城堡等)。
<table align="center" border="1" width="50%">
<tbody>
<tr>
<td align="center" valign="top"><small> <strong>主題</strong> </small></td>
<td colspan="3" align="center" valign="top"><small> 資料物件 </small></td>
</tr>
<tr>
<td align="center" valign="top"><small> <strong>觀察者</strong> </small></td>
<td align="center" valign="top"><small> 客戶端一 </small></td>
<td align="right" valign="top"><small> 客戶端二</small></td>
<td align="center" valign="top"><small> 客戶端三 </small></td>
</tr>
</tbody>
</table>
<br clear="all">
<br>
在Observer模式中的主角為主題(subject)與觀察者(observer),觀察者訂閱它感興趣的主題,一個主題可以被多個觀
察者訂閱,當(dāng)主題的狀態(tài)發(fā)生變化時,它必須通知(notify)所有訂閱它的觀察者,觀察者檢視主題的狀態(tài)變化,并作出對應(yīng)的動作,所以O(shè)bserver
模式也稱之為Publish-Subscribe模式。 <br>
<br>
Observer模式的 UML 圖如下所示:<br>
<div style="text-align: center;"><img style="width: 544px; height: 268px;" alt="Observer" title="Observer" src="images/observer-1.jpg"></div>
<br>
Subject類中有一個notify()方法,通常是在Subject的狀態(tài)發(fā)生改變時呼叫它,notify()中會呼叫
Observer的update()方法,通常會先取得Subject的新狀態(tài),然后更新Observer的顯示或行為,這個過程我們可以透過
Sequence Diagram來表達: <br>
<div style="text-align: center;"><img style="width: 378px; height: 294px;" alt="Observer" title="Observer" src="images/observer-2.jpg"><br>
</div>
<br>
在Java中支援觀察者模式,要成為觀察者的類必須實作Observer介面,這個介面中定義了一個update()方法,這個方法會被主題物件在通知狀態(tài)變化時呼叫,您必須在這個方法中實作您所想要的對應(yīng)行為。<br>
<br>
主題物件會是Observable的子類,在這邊注意兩個重要的方法:setChanged()與notifyObserver()。
setChanged()是用來設(shè)定主題物件的狀態(tài)已經(jīng)被改變,而notifyObserver()方法會通知所要訂閱主題物件的觀察者,調(diào)用其
update()方法。<br>
<br>
有興趣的話,建議看一下Java的Observable.java中是如何實作的,這有助于了解Observer模式的運作方式。<br>
<br>
</body>
</html>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -