喜歡本文的請隨意轉(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)之處,還請各位斧正,謝謝。