MVC、MVP腥椒、MVVM

MVC:

Model: 應(yīng)用數(shù)據(jù)和處理數(shù)據(jù)的邏輯阿宅;一般對應(yīng) JavaBean及一些repository

View: 屏幕上看見的對象就是View對象;一般對應(yīng) Xml 中定義的各類組件

Controller: 邏輯處理單元笼蛛,視圖與模型對象的聯(lián)系紐帶洒放,響應(yīng) View 觸發(fā)的各類事件、管理 Model 與 View 間的數(shù)據(jù)流動(dòng)滨砍;Android 里一般對應(yīng) Activity往湿、Fragment、Service惋戏。

缺點(diǎn):

View 視圖層對應(yīng)xml布局文件领追,所做的事情相當(dāng)有限,布局文件中的事件綁定响逢,數(shù)據(jù)處理都是在acvitity中進(jìn)行绒窑,造成 Acvitity 既像 View 又像 Controller。

MVC完整的流程:
MVC 流程圖

什么是 MVP

MVP 與 MVC 最大的區(qū)別就在與將 Model 和 View 通過 Presenter 隔開了舔亭,不再允許其互相直接通信些膨,而所有的消息都是通過 Presenter 這個(gè)中間人來傳遞。而這樣做的目的主要是為了將數(shù)據(jù)和展示劃出更明確的界限钦铺。

并不標(biāo)準(zhǔn)的 MVC 到 MVP 的一個(gè)轉(zhuǎn)變订雾,減少了 Activity 的職責(zé),簡化了 Activity中的代碼职抡,將復(fù)雜的邏輯代碼提取到了 Presenter 中進(jìn)行處理葬燎。與之對應(yīng)的好處就是,耦合度更低,更方便的進(jìn)行測試

各自職責(zé):

  1. Model:負(fù)責(zé)定義數(shù)據(jù)(解決什么是數(shù)據(jù))
  2. Presenter:負(fù)責(zé)在Model和View之間谱净,從model里取出數(shù)據(jù)窑邦,格式化后在View上展示(解決如何把數(shù)據(jù)和用戶界面放在一起)。
  3. View:負(fù)責(zé)擔(dān)任一個(gè)被動(dòng)界面壕探,用于展示數(shù)據(jù)冈钦。(解決如何展示數(shù)據(jù))

Presenter 作為中間者,同時(shí)擁有 View 和 Model 的引用李请,在它們之間起到橋梁作用瞧筛,即 Presenter 會(huì)主動(dòng)和 View 和 Model 進(jìn)行通信

Model 和 View 必須是完全隔離的导盅,不允許兩者之間互相通信较幌,保持對彼此的不感知,這樣的好處是徹底將數(shù)據(jù)和展示分離來開白翻,并且可以獨(dú)立的為Model去做測試乍炉。

Model 在三者中是獨(dú)立性最高的,Model不應(yīng)該擁有對View的引用滤馍,而且Model也不需要保存對Presenter的引用岛琼,對于Presenter而言,Model只需要提供接口巢株,等著Presenter來調(diào)用時(shí)返回相應(yīng)數(shù)據(jù)即可,Model 也不應(yīng)該去通知View槐瑞,而是通知 Presenter 來間接的更新View的。

Presenter 和 Model:基于接口來通信阁苞,這樣才能把 Model 和Presenter 的耦合度也降到最低困檩,那么在需要改變 Model 內(nèi)部實(shí)現(xiàn),甚至徹底替換 Model 的時(shí)候猬错,Presenter 則是無需隨之改變的窗看。這樣做帶來的另一個(gè)好處就是你可以通過 Mock 一個(gè) Model 來對 Presenter 以及 View 做模擬測試了,從而提高了可測試性倦炒。

View 和 Presenter:View是需要擁有對Presenter的引用显沈,但僅僅是為了將用戶的操作和事件立即傳遞給Presenter,為了讓 View 和 Presenter 耦合較低逢唤,View也只應(yīng)該通過接口與 Presenter 通信拉讯,從而保證 View 是完全被動(dòng)的,一方面它由用戶的操作觸發(fā)來和Presenter通信鳖藕,另一方面它完全受 Presenter 控制魔慷,唯一需要做的事情就是如何展示數(shù)據(jù)。

三者之間的關(guān)系:

  • View 和 Model 之間沒有聯(lián)系

  • View 通過接口向 Presenter 來傳遞用戶操作

  • Presenter 通過接口和 View/Model 來聯(lián)系著恩。

  • Model 不主動(dòng)和 Presenter 聯(lián)系院尔,被動(dòng)的等著 Presenter 來調(diào)用其接口

    View <- 接口 <- Presenter ->接口 -> Model
    View -> 接口 -> Presenter <- 接口 <- Model

為什么使用 MVP

在 MVC 中蜻展,XML視圖功能太弱,所以 Activity 既要負(fù)責(zé)視圖的顯示又要加入控制邏輯邀摆,往往需要同時(shí)承擔(dān)和 V 和 C 兩部分職責(zé)纵顾,代碼過于臃腫,不好維護(hù)和擴(kuò)展栋盹,比如說當(dāng)修改數(shù)據(jù)獲取方式的時(shí)候施逾,需要修改的地方太多,而且需要把整個(gè)業(yè)務(wù)邏輯全部看一遍例获,且容易修改錯(cuò)汉额;而當(dāng)使用的MVP模式時(shí),只需要修改 Model 中獲取數(shù)據(jù)的方式榨汤,因?yàn)?Presenter 層拿到的是 Model 的接口,只關(guān)心 Model 層返回的數(shù)據(jù),至于你的數(shù)據(jù)是從網(wǎng)絡(luò)還是數(shù)據(jù)庫還是本地?cái)?shù)據(jù)庫文件獲取的,根本不必關(guān)心蠕搜。 MVP 讓 Activity 成為真正的 View。

優(yōu)點(diǎn):

  1. 分層更加清晰明確
  2. 更利于擴(kuò)展和維護(hù)
  3. 方便對于 Model 進(jìn)行單獨(dú)測試

缺點(diǎn):

  1. 類比較多
  2. 由于對視圖的渲染放在了 Presenter 中收壕,所以視圖和Presenter的交互會(huì)過于頻繁讥脐。
  3. 如果 Presenter 過多地渲染了視圖,往往會(huì)使得它與特定的視圖的聯(lián)系過于緊密啼器。一旦視圖需要變更,那么Presenter也需要變更了

MVVM

ViewModel:
創(chuàng)建關(guān)聯(lián)俱萍,將 Model 和 View 綁定起來,如此之后端壳,我們 Model的更改,通過ViewModel 反饋給 View,從而自動(dòng)刷新界面枪蘑。DataBinding是一個(gè)實(shí)現(xiàn)數(shù)據(jù)和UI綁定的框架损谦,是構(gòu)建MVVM模式的一個(gè)關(guān)鍵的工具,它是支持雙向綁定的岳颇。

ViewModel 只做和業(yè)務(wù)邏輯和業(yè)務(wù)數(shù)據(jù)相關(guān)的事照捡,不做任何和UI、控件相關(guān)的事话侧,ViewModel 層不會(huì)持有任何控件的引用栗精,更不會(huì)在ViewModel中通過UI控件的引用去做更新UI的事情。ViewModel就是專注于業(yè)務(wù)的邏輯處理瞻鹏,操作的也都是對數(shù)據(jù)進(jìn)行操作悲立,這些個(gè)數(shù)據(jù)源綁定在相應(yīng)的控件上會(huì)自動(dòng)去更改UI,開發(fā)者不需要關(guān)心更新UI的事情新博。

總結(jié):
View 層的 Activity 通過 DataBinding 生成 Binding 實(shí)例,把這個(gè)實(shí)例傳遞給ViewModel薪夕,ViewModel 層通過把自身與 Binding 實(shí)例綁定,從而實(shí)現(xiàn) View 中l(wèi)ayout 與 ViewModel 的雙向綁定赫悄。mvvm的缺點(diǎn)是數(shù)據(jù)綁定使得 Bug 很難被調(diào)試原献。你看到界面異常了馏慨,有可能是你 View 的代碼有 Bug,也可能是 Model 的代碼有問題姑隅。數(shù)據(jù)綁定使得一個(gè)位置的 Bug 被快速傳遞到別的位置写隶,要定位原始出問題的地方就變得不那么容易了。

databinding

  1. gradle 中
dataBinding {
            enabled true
    }
  1. xml 中
    最外層使用 layout 標(biāo)簽粤策,通過 data 標(biāo)簽將該 View 對于的 Model 導(dǎo)入進(jìn)來樟澜,然后在控件中比如 TextView 的 text 屬性就可以和該 Model 的屬性綁定。
    支持運(yùn)算符操作叮盘。如三元
    支持事件綁定秩贰。

  2. Activity 中

ActivityMainTestBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main_test);
binding.setTest(testModel);

不需要寫 findViewById 和 butterknife,只需要

android:id="@+id/tv"
TextView tv = binding.tv;

部分參考: http://www.reibang.com/p/50c7124f408e

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末柔吼,一起剝皮案震驚了整個(gè)濱河市毒费,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愈魏,老刑警劉巖觅玻,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異培漏,居然都是意外死亡溪厘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進(jìn)店門牌柄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畸悬,“玉大人,你說我怎么就攤上這事珊佣√;拢” “怎么了?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵咒锻,是天一觀的道長冷冗。 經(jīng)常有香客問我,道長惑艇,這世上最難降的妖魔是什么蒿辙? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮敦捧,結(jié)果婚禮上须板,老公的妹妹穿的比我還像新娘。我一直安慰自己兢卵,他們只是感情好习瑰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秽荤,像睡著了一般甜奄。 火紅的嫁衣襯著肌膚如雪柠横。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天课兄,我揣著相機(jī)與錄音牍氛,去河邊找鬼。 笑死烟阐,一個(gè)胖子當(dāng)著我的面吹牛搬俊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜒茄,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼唉擂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了檀葛?” 一聲冷哼從身側(cè)響起玩祟,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屿聋,沒想到半個(gè)月后空扎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡润讥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年转锈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楚殿。...
    茶點(diǎn)故事閱讀 38,629評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡黑忱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出勒魔,到底是詐尸還是另有隱情,我是刑警寧澤菇曲,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布冠绢,位于F島的核電站,受9級特大地震影響常潮,放射性物質(zhì)發(fā)生泄漏弟胀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一喊式、第九天 我趴在偏房一處隱蔽的房頂上張望孵户。 院中可真熱鬧,春花似錦岔留、人聲如沸夏哭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竖配。三九已至何址,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間进胯,已是汗流浹背用爪。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胁镐,地道東北人偎血。 一個(gè)月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像盯漂,于是被迫代替她去往敵國和親颇玷。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評論 2 348

推薦閱讀更多精彩內(nèi)容