剛出來工作的時候維護過一個老系統,該系統是用微軟的ASP(Active Server Pages 動態服務器頁面)寫的。每一個頁面都是一個ASP文件,每一個一個ASP文件中又同時包含了HTML、CSS、Java Script、VB Script代碼,把這么多代碼糅合在一起,可以想象一下如果一個這樣的頁面包含復雜的業務邏輯,每當要對系統進行維護或增加新功能的時候那個酸爽~
像上面這種把界面、業務邏輯和數據模型都整合在一起的做法,從軟件的設計和可維護性方面看都是極不可取的。為了解決上述問題就發展出了各種MV*框架模式(MV*理論本身是一種模式,但它的各種實現又叫MV*框架),它是通過解決M和V的耦合問題來實現界面分離。
- MVC:Model-View-Controller
- MVP:Model-View-Presenter
- MVVM:Model-View-ViewModel
總結:可以從上面的全稱可以看出無論MVC、MVP和MVVM都是圍繞着Model和View,都是為了解決Model和View的耦合問題,只是實現的思想不一樣而已。
MVC
MVC把軟件系統分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller),關系如下圖所示:
模型(Model):數據庫相關的操作、文件的訪問和數據結構等。
視圖(View):專注於顯示,如Web前端(HTML/CSS/Java Script)
控制器(Controller):連接模型和視圖,如把視圖的請求發送給模型或把數據返回給視圖等
MVC只是一種框架模式,針對不同的平台環境的實現方式會有些區別:
Web MVC
經典的Web MVC模式,實現的框架有ASP.Net MVC/Spring MVC 等,在Web MVC中Model的數據通過Controller返回給View。
桌面UI MVC
經典實現有PureMVC,PureMVC 是在基於MVC模式建立的一個輕量級的應用框架。它的Model與View的交互是通過觀察者模式實現的,當Model有變化要通知View的時候Model把消息發送給通知分發中心,然后通知分發中心把消息發送到View。
總結:
MVC的實現了視圖和模型的分離,避免了視圖和模型糅合在一起,當視圖改變的時候只要業務邏輯沒變不需要改變模型;但是它有一個缺點缺點是因為MVC中的控制器並不能直接更新視圖,所以MVC並不能實現視圖和模型的完全分離,視圖依然依賴模型的數據(數據結構)來顯示,也就是說視圖依賴模型。
MVP
MVP是針對MVC的缺點而進行了改進,它把軟件系統分為三個基本部分:模型(Model)、視圖(View)和展示器(Presenter),關系如下圖所示:
模型(Model):數據庫相關的操作、文件的訪問和數據結構等。
視圖(View):專注於顯示,如Web前端(HTML/CSS/Java Script)
展示器(Presenter):連接模型和視圖,處理視圖的請求並根據模型更新視圖。
總結:
MVP用展示器代替了控制器,而展示器是可以直接更新視圖,所以MVP中展示器可以處理視圖的請求並遞送到模型又可以根據模型的變化更新視圖,實現了視圖和模型的完全分離。
MVVM
MVVM是MVP更進一步的發展,把軟件系統分為三個基本部分:模型(Model)、視圖(View)和視圖模型(ViewModel),關系如下圖所示:
模型(Model):數據庫相關的操作、文件的訪問和數據結構等。
視圖(View):專注於顯示,如Web前端(HTML/CSS/Java Script)
視圖模型(ViewModel):連接模型和視圖,視圖模型和視圖是雙休綁定的。
總結:
MVVM用視圖模型代替了MVP中的展示器,視圖模型和視圖實現了雙向綁定,當視圖發生變化的時候視圖模型也會發生改變,當視圖模型變化的時候視圖也隨之變化。
MVC/MVP/MVVM都是根據不同的應用需求和應用環境逐步發展而來的,它們都有各自優缺點和適用環境。比如Web開發中因為要跨越網絡通訊,如果使用MVP或者MVVM來實現代價是巨大的,因為目前來說網絡數據很珍貴的資源。