跳到內容

模型-檢視-控制器

25% developed
來自華夏公益教科書,開放的書籍,開放的世界

備忘錄 計算機科學設計模式
模型-檢視-控制器
觀察者

模型-檢視-控制器 (MVC) 模式是一種主要用於建立 圖形使用者介面 (GUI) 的架構模式。該模式的主要前提是基於模組化,其目的是將 GUI 的三個不同方面分開:資料 (模型)、資料的視覺化表示 (檢視) 以及檢視和模型之間的介面 (控制器)。將這三個元件分開背後的主要思想是使每個元件儘可能獨立於其他元件,對一個元件的更改不會影響對其他元件的更改。這樣,例如,可以更新 GUI 的新外觀或視覺化樣式,而無需更改資料模型或控制器。

新手可能會認為 MVC 模式浪費,主要是因為您在執行時使用許多額外的物件,而一個大型物件似乎就足夠了。但 MVC 模式的秘密不在於編寫程式碼,而在於維護程式碼,並允許人們修改程式碼而不改變太多其他內容。不同的開發人員有不同的優勢和劣勢,因此圍繞 MVC 進行團隊建設更容易。想象一個檢視團隊負責提供出色的檢視,一個模型團隊對資料瞭如指掌,以及一個控制器團隊能夠了解應用程式流程的大局,處理請求,與模型一起工作,併為該客戶端選擇最合適的下一個檢視。

模型-檢視-控制器模式的一大優勢是能夠在實現不同的檢視時重用應用程式的邏輯(在模型中實現)。一個很好的例子是在 Web 開發中,一個常見的任務是在現有軟體中實現外部 API。如果嚴格遵循 MVC 模式,這隻需要修改控制器,控制器可以根據使用者代理請求的內容型別呈現不同型別的檢視。

模型

通常,模型首先構建。模型有兩個任務:它必須儲存狀態管理訂閱者。狀態不需要是特殊的;您只需要定義如何使用設定器和獲取器儲存資料。但是,任何可以更改的內容(任何屬性)都必須有一個監聽器列表,當值更改時,它會聯絡這些監聽器。屬性監聽器允許我們對相同資料有多個檢視,當狀態更改時,所有這些檢視都會即時更新。此程式碼通常可以在超類中定義並繼承,因此您只需在一個地方編寫它,然後它就可以一致地應用於每個屬性。巢狀狀態(例如,動態配置的屬性)可能需要您對如何報告更改進行一些額外的思考。

人們有時使用“模型”一詞來指代“資料模型”——應用程式中資料結構的架構。一個好的 MVC 框架會為您處理模型超類和訂閱,因此您只需在該框架的模型語言中定義自己的資料結構,然後立即構建其他元件。從終端使用者意義上講,定義資料模型等同於定義模型。但是,如果您正在設計一個框架,那麼如果沒有屬性監聽器,它就不是 MVC。

檢視

編寫資料模型後,接下來最容易編寫的是檢視。檢視是訂閱模型的應用程式的一部分。通常,它會將模型呈現給使用者以及使用者介面或 GUI。GUI 也包含其他元件,這些元件通常是控制器的一部分,可以在以後處理。

您還可以使用與使用者介面無關的檢視-控制器元件。例如,您可以想象一個 MVC 電路板應用程式,其中模型僅管理整個電路中的數字(電壓和電流)。例如,電阻器會對兩端電壓有一個“檢視”,並與“控制器”緊密耦合,該控制器會更新流過該電阻器的電流。透過模型互相通訊的所有元件最終將即時執行電路的動作。

編寫檢視時,要考慮兩個方面:“當狀態更改時我該怎麼辦?”和“我如何將此內容顯示給使用者?”您的 MVC 框架通常為模型中的各種屬性提供編輯器,例如日期選擇器、文字欄位、滑動條和 組合框。更復雜的屬性通常需要更復雜的檢視和編輯器,例如樹檢視。您的 MVC 框架可能已經弄清楚如何將這些元件連線到模型,甚至可能根據模型中給定屬性的型別自動生成合適的元件。

控制器

GUI 的其餘部分——當模型更改時不會更新的部分——是控制器的責任。這包括在檢視中導航,以及當有人嘗試編輯檢視中的資料時您要做什麼。嚴格來說,檢視不能編輯,它是“只讀”的——當您嘗試修改檢視中的欄位時,控制器需要獲取編輯事件,處理它,並將其傳送到模型;當值實際更改時,模型會更新檢視。

不同的框架以不同的方式處理控制器。一些框架允許將回調函式與編輯器相關聯,這些回撥函式在值更改時被呼叫。其他框架允許您直接向元件新增監聽器,這些監聽器可以在編輯器中的值更改、單擊編輯器或編輯器失去焦點等情況下收到通知。在許多框架中,控制器表現為一系列方法和監聽器,這些方法和監聽器內建在資料模型和檢視中。例如,如果您在模型中有一個“密碼”屬性,該屬性需要在儲存之前進行 加鹽雜湊處理,此邏輯可能會出現在資料模型中名為 setPassword 的函式中。同樣,當框架生成檢視時,檢視的視窗小部件通常不是隻讀的,而是讀寫的,具有監聽器。MVC 框架提供的實際控制器然後“插入”到每個這些介面中,並在它們之間傳遞資料。

驗證

如果可能,通常最好允許模型執行所有必要的驗證,以便對允許值的任何更改,或者對驗證過程本身的任何更改,只需在一個地方進行。但是,在某些語言的某些情況下,這可能無法實現。例如,如果使用文字欄位編輯數字屬性,那麼檢視傳遞給控制器的屬性值將是文字,而不是數字。在這種情況下,可以使模型具有一個附加方法,該方法將文字作為該屬性的輸入值,但更有可能的是,控制器將執行文字的初始解析以獲取數值,然後將其傳遞給模型以進行進一步的驗證(例如,邊界檢查)。當控制器或模型確定傳遞的值無效時,控制器需要告訴檢視該值無效。在某些情況下,檢視可能會顯示錯誤對話方塊或其他通知,或者它可能會簡單地將其編輯器中的值還原到舊的有效值。

Java 中的實現

在 Java 中,我們可以實現一個胖客戶端 GUI。在這種情況下,我們可以使用

但是,在 Java EE 中,我們還可以實現一個 Web 應用程式。在這種情況下,我們可以使用


Clipboard

待辦事項
新增更多示例。


備忘錄 計算機科學設計模式
模型-檢視-控制器
觀察者


您對本頁有疑問嗎?
在這裡提問


在本圖書中建立一個新頁面


華夏公益教科書