用UML來表示經典的設計模式MVC
在長期的軟體實踐過程中,人們逐漸總結出了一些實用的設計模式,並將它們應用於具體的軟體系統中,出色地解決了很多設計上的難題。源於Smalltalk,並在Java中得到廣泛應用的模型-檢視-控制器(Model-View-Controller,MVC)模式,是非常經典的一個設計模式,通過它你可以更好地理解"模式"這一概念。
MVC模式通常用在開發人機互動軟體的時候,這類軟體的最大特點就是使用者介面容易改變,例如,當你要擴充套件一個應用程式的功能時,通常需要修改選單來反映這種變化。如果使用者介面和核心功能緊緊交織在一起,要建立這樣一個靈活的系統通常是非常困難的,因為很容易產生錯誤。為了更好地開發這樣的軟體系統,系統設計師必須考慮下面兩個因素:
- 使用者介面應該是易於改變的,甚至在執行期間也是有可能改變的;
- 使用者介面的修改或移植不會影響軟體的核心功能程式碼。
為了解決這個問題,可以採用將模型(Model)、檢視(View)和控制器(Controller)相分離的思想。在這種設計模式中,模型用來封裝核心資料和功能,它獨立於特定的輸出表示和輸入行為,是執行某些任務的程式碼,至於這些任務以什麼形式顯示給使用者,並不是模型所關注的問題。模型只有純粹的功能性介面,也就是一系列的公開方法,這些方法有的是取值方法,讓系統其它部分可以得到模型的內部狀態,有的則是置值方法,允許系統的其它部分修改模型的內部狀態。
檢視用來向用戶顯示資訊,它獲得來自模型的資料,決定模型以什麼樣的方式展示給使用者。同一個模型可以對應於多個檢視,這樣對於檢視而言,模型就是可重用的程式碼。一般來說,模型內部必須保留所有對應檢視的相關資訊,以便在模型的狀態發生改變時,可以通知所有的檢視進行更新。
控制器是和檢視聯合使用的,它捕捉滑鼠移動、滑鼠點選和鍵盤輸入等事件,將其轉化成服務請求,然後再傳給模型或者檢視。整個軟體的使用者是通過控制器來與系統互動的,他通過控制器來操縱模型,從而向模型傳遞資料,改變模型的狀態,並最後導致檢視的更新。
MVC設計模式將模型、檢視與控制器三個相對獨立的部分分隔開來,這樣可以改變軟體的一個子系統而不至於對其它子系統產生重要影響。例如,在將一個非圖形化使用者介面軟體修改為圖形化使用者介面軟體時,不需要對模型進行修改,而新增一個對新的輸入裝置的支援,則通常不會對檢視產生任何影響。
應用了MVC設計模式的軟體系統,其基本的實現過程是:
- 控制器建立模型;
- 控制器建立一個或多個檢視,並將它們與模型相關聯;
- 控制器負責改變模型的狀態;
- 當模型的狀態發生改變時,模型會通知與之相關的檢視進行更新。
如果用UML來表示MVC設計模式,則如圖1所示: