1. 程式人生 > >MVC,MVP 和 MVVM(轉載)

MVC,MVP 和 MVVM(轉載)

1 什麼是MVC

MVC的目的是為了把資料(Model)和檢視(View)分離開來,然後用控制器(Controller)作膠水來粘合M和V之間的關係。

這樣做的目的是為了實現注意點分離這樣一個更高層次的設計理念,也就是讓專業的物件做專業的事情,View就只負責檢視相關的東西,Model就只負責描述資料模型,Controller負責總控,各自協作,別總摻和到一起亂成一鍋粥!

1.1 分層

  • 檢視(View):使用者介面,專門負責表現
  • 控制器(Controller):業務邏輯
  • 模型(Model):資料儲存,專門負責資料

各部分之間的通訊方式如下。

image

  1. View傳送指令到 Controller
  2. Controller完成業務邏輯後,要求Model改變狀態
  3. Model將新的資料傳送到View,使用者得到反饋

所有通訊都是單向的。

1.2 互動模式

接受使用者指令時,MVC可以分成兩種方式。一種是通過View接受指令,傳遞給Controller。

image

另一種是直接通過controller接受指令。

image

1.3 例項

實際專案往往採用更靈活的方式,以Backbone.js為例。

image

  1. 使用者可以向View傳送指令(DOM 事件),再由View直接要求Model改變狀態。
  2. 使用者也可以直接向Controller傳送指令(改變URL觸發hashChange事件),再由Controller傳送給View。
  3. Controller非常薄,只起到路由的作用,而View非常厚,業務邏輯都部署在View。所以,Backbone 索性取消了Controller,只保留一個 Router(路由器) 。

MVP

MVP 模式將Controller改名為Presenter,同時改變了通訊方向。

image

  1. 各部分之間的通訊,都是雙向的。
  2. View與Model不發生聯絡,都通過Presenter傳遞。
  3. View非常薄,不部署任何業務邏輯,稱為"被動檢視"(Passive View),即沒有任何主動性,而Presenter非常厚,所有邏輯都部署在那裡。

MVVM

MVVM模式將Presenter改名為ViewModel,基本上與MVP模式完全一致。

image

唯一的區別是,它採用雙向繫結(data-binding):View的變動,自動反映在ViewModel,反之亦然。Angular和Ember都採用這種模式。

參考