鑒于上篇文章在上周五會議上被問到一些基礎性問題時引發(fā)了一些碰撞搞得我好尷尬,這篇我盡量寫的完備一些,但是我不寫示例代碼了,這篇文章最低門檻幾乎和上一篇一樣,是需要小伙伴們知道 JavaScript 是什么,/MV*/ 這個正則表達式能夠匹配到什么。
背景
最近為開發(fā)新版瑞信通做準備,看 demo 源碼時注意到 cache.js 中的一段注釋:
// 建議開發(fā)者選擇mvvm框架來通過數(shù)據(jù)來驅動UI變化
此篇我和小伙伴們分享的就是 MVVM,但是介紹 MVVM 之前,完備性起見要從 MVC 和 MVP 開始。
因為我手頭有 《JavaScript 設計模式》這本書,此篇文章也算是我對這本書做筆記了。
MVC
我覺得 MVC 是 well-known 并不會引起小伙伴們質疑,正文從下述 MVP 簡介開始。
MVP
模型-視圖-表示器(MVP)是 MVC 設計模式的一種衍生模式,專注于改進表示邏輯。它是在 1990 年代由 Taligent 公司創(chuàng)造的。
Model、View 和 Presenter
MVP 中的 P 代表表示器。這是一個包含用于 View(視圖)的用戶界面業(yè)務邏輯的組建。與 MVC 不同,來自 View(視圖)的調(diào)用將委托給表示器,表示器是從 View(視圖)中解耦,通過接口與它對話。
最后一句話總結一下 MVP 和 MVC 之間的區(qū)別:
Model View Presenter設計模式實際上就是許多開發(fā)人員已經(jīng)熟悉的模型視圖控制器的一個最新版本;兩者的主要區(qū)別是MVP真正將UI從應用程序的域/服務層中分離。
MVVM
MVVM(模型-視圖-視圖模型)是一種基于 MVC 和 MVP 的架構模式,它試圖更清晰地將用戶界面(UI)開發(fā)從應用程序的業(yè)務邏輯與行為中分離。
Model:和 MV* 家族的其他成員一樣,MVVM 中的 Model(模型)表示應用程序將會使用的特定領域數(shù)據(jù)或信息。
View:與MVC一樣,View實際上僅是與用戶進行交互的應用程序的一部分。
ViewModel:可以將ViewModel作為一個專門的Controller,充當數(shù)據(jù)轉換器。它將Model信息轉變?yōu)?View信息,還將命令從View傳遞到Model。
小結:View 和 ViewModel、ViewModel 和 Model
View和ViewModel之間通過數(shù)據(jù)綁定和事件進行通信。View處理自己的用戶界面事件,必要是將它們映射到ViewModel。Model和ViewModel上的屬性通過雙向數(shù)據(jù)綁定進行同步和更新。
ViewModel似乎是完全負責MVVM中的Model,但這種關系中有一些微妙之處值得我們注意。ViewModel可以為了數(shù)據(jù)綁定而暴露Model或Model屬性,也可以包含接口,用于獲取和操作在View
中暴露的屬性。
MVC、MVP 與 MVVM
MVP 和 MVVM 均是 MVC 的衍生品。MVC 與其衍生品之間的主要區(qū)別是每一層對其他層的依賴,以及它們是如何緊密地互相綁定的。
在
MVC中,View位于架構之上,與Controller(控制器)相鄰。Model位于Controller(控制器)之下,因此View了解Controller(控制器),Controller(控制器)了解Model。在這里,View能夠直接訪問Model。但是,向View暴露完整的Model可能會帶來安全性和性能成本,這取決與應用程序的復雜性。MVVM試圖避免這些問題。
在MVP中,Controller(控制器)的作用被Presenter所替代。表示器與View(視圖)位于同一位置,監(jiān)聽View和Model的事件,并調(diào)解它們之間的行動。與MVVM不同,它沒有使用將View綁定至ViewModel的機制,因此我們轉而依賴每個View來實現(xiàn)用于讓Presenter與View進行交互的接口。
因此,MVVM允許我們創(chuàng)建Model的特定于View的子集,它們可以包含狀態(tài)和邏輯信息,無需向View暴露整個Model。與MVP的Presenter不同,引用View時不需要ViewModel。View可以綁定到ViewModel上的屬性,而屬性會將Model所包含的數(shù)據(jù)暴露給View。如前所述,View的抽象意味著它背后的代碼所要求的邏輯更少了。