原文鏈接:http://www.tinmegali.com/en/model-view-presenter-android-part-1/
作者主頁(yè):http://www.tinmegali.com/en/
架構(gòu)模式是計(jì)算機(jī)科學(xué)的基礎(chǔ)徽职,它是維持一個(gè)工程干凈、可擴(kuò)展以及可測(cè)試的唯一方式。模式已經(jīng)是發(fā)展多年的解決方案狼纬,并且被視為工業(yè)標(biāo)準(zhǔn)。它們?cè)诔掷m(xù)的發(fā)展,在Android SDK中,可靠的模型-視圖-控制器模式正漸漸地因模型-視圖-展示器模式而廢棄孝治。
文章的第一部分將主要討論MVC(Model View Controller)和MVP(Model View Presenter)的差別、為什么MVC將被廢棄以及MVP如何適應(yīng)Android SDK并發(fā)揮其優(yōu)勢(shì)审磁。
Android SDK
當(dāng)我們簡(jiǎn)要分析Android SDK谈飒,尤其是分析layout和Activity以及data間的關(guān)系時(shí),我們印象中最適合Android的就是MVC了态蒂。然而杭措,隨著工程越來(lái)越復(fù)雜,MVC提供的關(guān)注點(diǎn)分離(separation of concerns)已經(jīng)不夠钾恢,這點(diǎn)在實(shí)現(xiàn)單元測(cè)試時(shí)尤為明顯手素。
然而,在Android的設(shè)計(jì)計(jì)劃中是允許開發(fā)者使用其他類型的架構(gòu)模式瘩蚪,甚至沒(méi)有任何模式的泉懦,即所謂的反模式。即使MVC是可靠并且廣為人知的解決方案疹瘦,但因?yàn)樗男⌒值躆VP的存在祠斧,其地位每況愈下,MVP有著一些優(yōu)勢(shì)拱礁,比如設(shè)計(jì)更好的關(guān)注點(diǎn)分離。
我應(yīng)該在項(xiàng)目中使用MVC還是MVP呢辕漂?
對(duì)于這個(gè)問(wèn)題呢灶,其實(shí)沒(méi)有準(zhǔn)確的答案。有些人認(rèn)為MVC是解決方案钉嘹,還有一些人站在MVP這邊鸯乃,還有一些人傾向于另一個(gè)方案,例如MVVM跋涣。每種方案都有著其優(yōu)缺點(diǎn)缨睡。這意味著唯一能回答這個(gè)問(wèn)題的前提就是你了解每種方案的優(yōu)勢(shì)和劣勢(shì),這樣你就可以做出明智的選擇陈辱。
MVC的定義
模型-視圖-控制器是一種軟件架構(gòu)模式奖年,它主要用于(但不僅限于)實(shí)現(xiàn)計(jì)算機(jī)上的用戶界面。MVC把一個(gè)軟件程序分成相互聯(lián)系的3個(gè)部分沛贪,使得把內(nèi)部表示的消息和展示給用戶的信息或者從用戶接收的信息分離開來(lái)陋守。
來(lái)自維基百科
模型-視圖-展示器(MVP)是由MVC架構(gòu)模式推到出來(lái)的震贵,主要用于構(gòu)造用戶界面。
在MVP中水评,presenter充當(dāng)“中間人”的角色猩系,所有展示邏輯都交由它處理。
來(lái)自維基百科
MVC和MVP的差別
模型-視圖-展示器(MVP)
- 視圖和模型分離中燥。展示器Presenter在Model和View間充當(dāng)中介寇甸。
- 更容易創(chuàng)建單元測(cè)試。
- 一般情況下疗涉,View和Presenter是一一對(duì)應(yīng)的拿霉,但對(duì)于復(fù)雜的View,有可能會(huì)對(duì)應(yīng)多個(gè)Presenter博敬。
模型-視圖-控制器(MVC)
- 控制器是基于行為的友浸,并且可以共享多個(gè)view
- 視圖可以直接和View交互
Android中的MVP
Android中的關(guān)注點(diǎn)分離不是很明確。例如偏窝,Activity和數(shù)據(jù)機(jī)制之間有著很緊密的聯(lián)系收恢。雖然,應(yīng)用程序成為可擴(kuò)展的祭往、可維護(hù)的和可測(cè)試的伦意,但是,創(chuàng)建一個(gè)深度的關(guān)注點(diǎn)分離是很重要的硼补,這也是我們采用MVP的最大優(yōu)勢(shì)驮肉。
實(shí)現(xiàn)MVP模式的最佳方式
這是一個(gè)模糊的話題。有很多有趣的方式實(shí)現(xiàn)MVP已骇,同樣也有很多方案用于Android上。模式實(shí)現(xiàn)方式因Presenter充當(dāng)?shù)慕巧煌煌蚀ⅰ5玀VP的核心是獨(dú)立于選擇之外的卵渴,應(yīng)該這樣維護(hù):
Presenter
Presenter充當(dāng)View和Model之間的“中間人”,它從Model中提起數(shù)據(jù)鲤竹,格式化后返回給View碘橘。和典型的MVC不同,Presenter還決定了你和View交互時(shí)發(fā)生什么岩榆。
View
View,通常由Activity實(shí)現(xiàn)折联,它包含了一個(gè)Presenter的引用。View唯一需要做的就是在有交互動(dòng)作時(shí)祥款,調(diào)用Presenter的方法抠艾。
Model
在一個(gè)擁有好的層級(jí)架構(gòu)的應(yīng)用中检号,Model僅僅是通往領(lǐng)域曾或業(yè)務(wù)邏輯的門戶。就把它看做我們想展示在View中數(shù)據(jù)的提供者吧。
上面這些極好的定義都是摘選自Antonio Leiva’s 文章.
在這個(gè)系列的下一篇文章中玛痊,我們將給出Android中MVP模式的實(shí)現(xiàn)卿啡。我們將采取更保守的方式,那就是僅僅使用標(biāo)準(zhǔn)的Android代碼俊鱼,而不會(huì)有任何Android SDK之外的任何第三方庫(kù)。這種方式會(huì)幫助我們理解MVP中不同層次之間的關(guān)系俗批。
如果你想了解最終的MVP庫(kù)(這個(gè)庫(kù)基于[Douglas C. Schmidt博士]的愿景放手去做的)岁忘,那么你將會(huì)很快就能看到!
引用
- http://antonioleiva.com/mvp-android/
- http://hannesdorfmann.com/android/mosby
- http://www.codeproject.com/Articles/288928/Differences-between-MVC-and-MVP-for-Beginners
- https://github.com/konmik/konmik.github.io/wiki/Introduction-to-Model-View-Presenter-on-Android
- https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter