架構(gòu)設(shè)計的歷史·MVC·MVP·MVVM

喜歡本文的請隨意轉(zhuǎn)載,但請留下原文地址,謝謝:


知識來自于經(jīng)驗的積累,而歷史是最深遠(yuǎn)的經(jīng)驗。——偶自己O(∩_∩)O~

一、MVC

經(jīng)典版:

1979年,Trygve Reenskaug在一篇論文中提出MVC模型。

當(dāng)時,具有強大交互能力的操作系統(tǒng)并不存在,而且并沒有當(dāng)下的控件概念,系統(tǒng)接收的都是直接來自鼠標(biāo)和鍵盤的事件。

所以當(dāng)時的概念中:

View,是僅僅用于展示,沒有交互能力的木偶視圖。

Controller,才是與用戶交互的直接對象,分發(fā)鼠標(biāo)和鍵盤的事件。

Model,更大意義上是一個動詞,是對整個業(yè)務(wù)場景的抽象建模。

沒錯,你沒有看錯,在原版的MVC中,View是通過觀察者模式,直接在Model中注冊,然后經(jīng)由Model更新界面的,而在下方,你將會看見更為熟悉的示意圖。

變體1:

控件系統(tǒng)或說是組件化思想的發(fā)展,促使View與Controller被封裝成一個個具有交互能力的控件。而且強大的操作系統(tǒng)也成長起來,大量的鍵鼠事件被它們管理起來。

于是View,開始成為與用戶交互的直接對象,

而對于Controller來說,來自鍵盤和鼠標(biāo)的事件則被抽象為View所發(fā)出的事件,

于是,當(dāng)下常見的MVC示意圖誕生了:

變體2:

某些場景下,人們認(rèn)為View和Model應(yīng)該更進(jìn)一步解耦,于是將對數(shù)據(jù)的訂閱下放到Controller層,如下圖:

此時一定會有人大呼,這不是MVP嗎?好吧,下面就會說道MVP,但是在此之前,有必要看一下剩下的變體。

更多變體:

主要是業(yè)務(wù)邏輯的部分,可能分出一部分在Controller或View層,當(dāng)然,嚴(yán)格來說是不符合規(guī)范的,但是當(dāng)實際編碼時,總是會有各種各樣的原因造成此類情況,這個。。你們懂的~~

二、MVP

雖然上面示意圖中,Controller畫成一大塊,但實際情況是,Controller是由很多小Controller組成的,它們或多或少的與View對應(yīng),就像View其實是由許多界面組成的一樣。

懶,是人的天性,不僅推動了時下熱門的懶人經(jīng)濟,也推動著科學(xué)技術(shù)的發(fā)展。Controller就是懶人們的下一個目標(biāo),而在歷史的那一刻站出來的懶人,他叫Mike Potel。

1996年,一篇論文中,他在MVC變體1(那個時候,控件系統(tǒng)已經(jīng)成熟)的基礎(chǔ)上,提出了MVP模型,與 MVC變體1 最大的區(qū)別在于:

Presenter是一個總控系統(tǒng),取代了大大小小的Controller們。

其原話:we refer to this kind of controller as a presenter.

看,Presenter是一個特殊的Controller。它與經(jīng)典版MVC中的C差異更大:

1、它是總控系統(tǒng)。

2、它接收來自控件系統(tǒng)的消息。

如圖:

當(dāng)然,MVP也有相應(yīng)的解耦版變體:

三、MVVM

最后,來說說真正比較大的改變:

2005年,微軟的架構(gòu)師John Gossman推出了MVVM模式。

其核心部分是DataBinding機制。顧名思義,其功能就是將Model的數(shù)據(jù)綁定到View層,甚至是將View層控件的變換綁定到Model的雙向綁定。

但是此前說了,Model是對現(xiàn)實場景的建模,但并非對UI界面的建模,所以Model往往并不能直接與View進(jìn)行綁定,所以需要添加一個中介,對View層進(jìn)行建模,即ViewModel:

MVVM真正的創(chuàng)舉在于對視圖建模的思想,特別是當(dāng)下的移動時代,對于開發(fā)有著豐富界面交互體驗的開發(fā)者來說,ViewModel似乎更契合業(yè)務(wù)場景。同時,強大的DataBinding機制也大大減少了工作量。

不過正如大家所想,ViewModel也是與View一一對應(yīng)的,所以會有很多很多個ViewModel,是不是有一種似曾相識的感覺?

歷史上的事情總是相似的。

太陽之下無新鮮事——所羅門

沒錯,推動技術(shù)革新的懶人們,不,是天才們很快又會站出來:

「寫那么多ViewModel實在是太麻煩啦!」

當(dāng)然,那是另外的故事了。

欲知詳情,歡迎關(guān)注我,并欣賞另一篇文章《Android架構(gòu)設(shè)計的變遷》


如有不當(dāng)之處,還請各位斧正,謝謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容