1. 程式人生 > >對 MVC、MTV 和 MVVM的理解總結

對 MVC、MTV 和 MVVM的理解總結

MVC

MVC(Model View Controller 模型-檢視-控制器)是一種Web架構的模式。 特點:把業務邏輯、模型資料、使用者介面分離開來,讓開發者將資料與表現解耦。 MVC三要素: Model(資料模型)。是對客觀事物的抽象。 比如知乎Live,Live就是一個模型,可以用Live類來表示。而一個模型通常還帶有很多的和業務相關的邏輯,比如新增,更新,獲取Live主講人資訊等等,這些組成了模型的方法。對於開發者模型的表示方法非常易懂和清晰,可以通過非常便捷的程式碼來做CURD操作而無需寫一條又一條的SQL語句。 View(檢視)。呈現給使用者的效果,呈現的內容是基於Model,它也是收集使用者輸入的地方。 比如看到一篇Live,資料是一個Live.get(live_id).to_dict()的結果,效果是通過對應的模板和樣式把這個資料展示出來。 Contorller
(控制器)。是Model和View之間的溝通者。 因為View中不會對Model作任何操作,Model不會輸出任何用於表現的東西,如HTML程式碼或者某種效果等,它就是點資料。而Contorller用於決定使用哪些Model,對Model執行什麼操作,為檢視準備哪些資料,是MVC中溝通的橋樑。 MVC的通訊是單向的: 瀏覽器傳送請求 Contorller和Model互動獲取資料 Contorller呼叫View View渲染資料返回 更簡單的表示式:V -> C-> M -> C -> V MTV 和Rails、Spring、Laravel等其他語言的Web框架不一樣,在Python的世界中,基本(除了Pylons)都使用了MVC的變種MTV
(Model Templates View 模型-模板-檢視): Model(資料模型)。和MVC的Model一樣,處理與資料相關的所有事務:如何存取、如何確認有效性、包含哪些行為以及資料之間的關係等。 Template(模板)。處理與表現相關的決定:如何在頁面或其他型別文件中進行顯示出來。 View。處理業務邏輯,檢視就是一個特定URL的回撥函式,回撥函式中描述資料:從Model取出對應的資料,呼叫相關的模板。它就是Contorller要呼叫的那個用來做Model和View之間的溝通函式,從而完成控制。 注意:MVC中的View的目的是「呈現哪一個資料」,而MTV的View的目的是「資料如何呈現」。 也就是把MVC中的View分成了檢視(展現哪些資料)和模板(如何展現)2個部分,而Contorller這個要素由框架自己來實現了,我們需要做的就是把(帶正則表示式的)URL對應到檢視就可以了,通過這樣的URL配置,系統將一個請求傳送到一個合適的檢視。 需要注意,Flask這種微框架就不是一個MVC模式的,因為它沒有提供Model,除非集成了SQLAlchemy之類的ORM進來。 MVVM
定義: MVVM(Model-View-ViewModel),是一種基於前端開發的架構模式。 核心是提供對View 和 ViewModel 的雙向資料繫結,View和Model之間並沒有直接的聯絡,而是通過ViewModel進行互動,View的變動,自動反映在ViewModel上,反之亦然,這樣就保證檢視和資料的一致性。 來源: 現在前端,不僅僅是簡單的資料展示了,它不僅要管理複雜的資料狀態,還要處理移動裝置上各種操作行為等等。因此,前端也需要工程化,也需要一個類似於MVC 的框架來管理這些複雜的邏輯,使開發更加高效: View UI佈局,展示資料 Model 管理資料 Controller 響應使用者操作,並將 Model 更新到 View 上 前端應用的複雜程度已不同往日,今非昔比。這時前端開發就暴露出了三個痛點問題: 開發者在程式碼中大量呼叫相同的DOM API, 處理繁瑣,操作冗餘,使得程式碼難以維護。 大量的DOM 操作使頁面渲染效能降低,載入速度變慢,影響使用者體驗。 當 Model 頻繁發生變化,開發者需要主動更新到View ;當用戶的操作導致Model發生變化,開發者同樣需要將變化的資料同步到Model中, 這樣的工作不僅繁瑣,而且很難維護複雜多變的資料狀態。 早期 jQuery 的出現就是為了前端能更簡潔的操作DOM 而設計的,但它只解決了第一個問題,另外兩個問題始終伴隨著前端一直存在。 MVVM 的出現,完美解決了以上三個問題。 MVVM 的三部分: Model 層代表資料模型,也可以在Model中定義資料修改和操作的業務邏輯; View 代表UI 元件,它負責將資料模型轉化成UI 展現出來, ViewModel 是一個同步View 和 Model的物件。 View 和 Model 之間並沒有直接的聯絡,而是通過ViewModel進行互動。 ViewModel 通過雙向資料繫結把 View 層和 Model 層連線了起來,而View 和 Model 之間的同步工作完全是自動的,無需人為干涉,因此開發者只需關注業務邏輯,不需要手動操作DOM, 不需要關注資料狀態的同步問題,複雜的資料狀態維護完全由 MVVM 來統一管理。 參考資料: