2009年7月12日 星期日

MVC範例程式

給Client端介面設計人員:
不好意思,說明文越打越長,暫時是打不完了。可以先看網路上的資料,但大多都很籠統。
其實MVC骨子裡就是Observer pattern,可以找這方面的資料來參考。

目前先寫出一個範例程式,可以看看:

http://docs.google.com/View?id=dfj5vj97_379qn4xpfz

在這個範例裡,Controller就是負責接收按鈕事件的ActionListener,Model是FrameState而View就是JButton和JFrame。Model的狀態只要一更動,就會通知View更新,因此View必須實作Observer介面,才可以註冊為Model的觀察者並接收更新訊息。

以下是下面的圖和程式碼行號的對應:

事件觸發:
使用Java的內部機制,110行的 actionPerformed會在按鈕事件觸發後被呼叫。

取得View的資料:
此範例不需要取得任何View的資料。

更新資料:
111行的state.setCurrentPanel(XXX); 就是更新model裡的資料。(state在本範例裡就是model)

通知有更新:
72和77行的notifyObservers(); 會呼叫96行的notifyObservers()方法,該方法會呼叫每個已註冊的Observer的stateChanged()方法。觀察者就會執行它們各自的stateChanged()實作。
這部份很像Strategy Pattern,可以參考Wiki

取得資料:
45行的state.getCurrentPanel()就是從state取得資料,並更新view。


如果有問題請再提出來。

--------------------------------------------------------------------------
以下是目前說明文完成的部分,全部完成後會放到言式法則上:

Model-View-Controller架構是相當被廣泛應用的架構模式之一,將物件在某一互動元件中所扮演的角色區分為Model、View與Controller,能夠有效地分離商業邏輯與使用者介面。
所謂的Model指的是資料內部表現,也就是資料結構;View是資料的外在表現,也就是與使用者互動的介面;Controller則是介於內外部資料表現之間的協調者,負責將外部要求反應到內部資料。因此MVC能用一句話概括:「內部資料表現必須直接反應到外部資料表現上,而外部要求必須經由協調者反應到內部資料表現上。」圖示如下:



必須注意這只是標準的架構。MVC有相當多變化的形式,各個物件之間不見得必須互有關連,例如MVP (Model-View-Presenter)就是一種MVC的衍伸,其Passive View的做法是將View與Model的直接關聯消除,改由Presenter去協調雙方。

如果覺得看上圖不清楚,我們生活週遭其實就有相當多MVC的例子可以現學現賣。試想你現在要使用印表機印出資料,你會在你的Word上按下列印按鈕,這個你可以看得到的按鈕,就是所謂的View(概念很簡單,因為你看得到它)。按下按鈕後,就會觸發事件,讓Word內部程序擷取Word的資料。資料經過處理後,會送到印表機的列印佇列上排隊等列印。這個內部程序就是Controller,負責把外部要求反應到內部資料。列印資料會暫存在列印佇列上等待,這個列印佇列是一種先進先出(FIFO)的資料結構,也就是Model。最後,Model會通知印表機有資料需要列印,資料就從印表機裡印出來了。印表機也是一種View。
看完這個故事,你可能會覺得很奇怪:為什麼View從一開始的按鈕變成印表機了?其實觸發事件的View與反映結果的View不需要是同一個,一切都取決於Controller怎麼協調。因此請將上圖的View、Model與Controller視為角色的集合,而不是單一物件。

沒有留言:

張貼留言