11-9 【理論】MVVM 架構
在 WPF 項目中,我們主要采用的是一種類似 MVC 的架構,叫做 MVVM。 MVVM 繼承了 MVC 的理念,是 Model-View-ViewModel 的縮寫,中文意思是模型、視圖、視圖模型。這三個詞分開看我們都能看懂,不過合在一起是什么意思呢?
既然合在一起看不懂,咱們還是分開來解釋吧。
什么是MVVM示例圖
? ? 首先, View。?
? ? 當我們創建一個新的 WPF 項目的時候,首先打開的是什么呢?是這個界面設計頁面, MainWindow.xaml 文件,沒錯吧?那這個 xaml 是干什么用的呢?它就是用來與 UI, 與用戶界面打交道的文件。在這個文件中,所有的設計元素、 UI 組件、代碼全部都可以看作視圖(View)。
? ? 所以說我們的視圖不僅包含 UI 界面,還包含了這個界面中所涉及的代碼邏輯。因此在 WPF 項目中, xaml 文件件以及 xaml.cs 文件,都可以被我們稱作視圖。在一個視圖中,我們可以創建文本框、 TextBox、 DatePicker、 Button 等等各種各樣的組件。而支撐這個視圖的數據則來自數據模型(Model)。?
? ? 比如說我們的 WPF 項目有兩個部分的數據,客戶的姓名以及預約數據。而這些數據分別對應的也正是我們數據庫中的兩張表。所有的數據定型和結構化處理都是由這個模型來完成的。在視圖中,我們可以根據模型的字段來顯示和更新數據。比如說客戶模型,我們需要包含他的姓名、身份證、住址等等信息。而預約模型應該包含客戶的 ID、 預約時間等等。
? ? 雖然對于一個 WPF 項目來說,僅僅使用 Model 和 View, 甚至只使用 View 也能完成各種各樣復雜的功能,比如說上一章我們的實戰項目只有 View, 同樣也可以完成客戶預約系統的開發。但是直接從視圖訪問數據庫是一種比較低級的開發方式,我們無法對數據進行隔離,無法進行復雜的業務開發,甚至無法可持續的維護系統。
? ? 所以我們必須要進行業務與數據的隔離,以及業務與界面的隔離。根據上述的原則,對于業務進行分離后,我們就得到了視圖模型。客戶視圖模型對應的就是客戶模型。視圖模型可以全部或者部分使用模型的字段。模型的字段通過映射的方式向視圖模型提供數據支持。而視圖模型與視圖則是雙向綁定,不僅可以讓用戶看到數據,還可以通過 UI 交互操作數據。
? ? 而視圖模型作為業務邏輯的載體,也會承擔與數據庫的溝通工作。
? ? 比如說, UI 上面有兩個按鈕,分別是刷新客戶信息和保存客戶信息。點擊刷新, UI 則會通過發送事件的方式通知視圖模型,而視圖模型在收到刷新請求以后,就會去數據庫提取數據,然后重新把數據提供給視圖。如果用戶點擊了保存信息的按鈕,那么視圖模型同樣會接收到更新事件,然后會把 UI 上用戶輸入的數據提交給數據庫,完成數據的更新。而最后我們的視圖模型則會處理一切與 UI 的交互行為。
什么是MVVM示例圖2
? ? 所以簡單來說, MVVM 架構就是由視圖、模型以及視圖模型構成。視圖模型訪問數據庫提取數據,通過使用模型來對象化數據,然后把數據綁定給 UI,也就是視圖。而視圖則處理一切與用戶的交互,并且把用戶數據反饋給視圖模型,由視圖模型的業務規則來提供下一步的處理。最后,視圖與模型之間由于加入了視圖模型,所以產生了系統的分層,而數據也得到了有效的隔離,它們之間則是一個間接引用的關系。
那么 MVVM 架構有什么優點呢?
? ·兼容MVC架構
? ·方便測試
? ·方便維護
第一,我們之前說過 MVVM是一種脫胎于 MVC 的架構,可以說是 MVC 的升級。所以 MVC 架構的項目可以非常輕松移植到 MVVM。?
第二,在 MVVM 里面, Controller 不再與 Model 進行綁定了,而通過 ViewModel 使用 Model 進行數據的對象化處理,所以業務與 UI 邏輯徹底分開,減輕了測試壓力。如果有 iOS 開發經歷,就會感覺到自從 Xcode 7 開始。 iOS 的測試變得越來越完善了。
第三,因為業務、 UI 數據全部獨立,所以不管是未來的維護還是系統升級都是非常舒服的。
當然, MVVM 也不是萬金油,它也有缺點。
? ·代碼量增加
? ·對象調用復雜度增加
比如說使用它,代碼量會有明顯的增加,這一點在接下來的課程中就會看到。而且對象的調用也會比較復雜,…… 不用太擔心!
?