談?wù)凪VC模式和MVP模式

前言

最近在研究Android的MVP設(shè)計模式,經(jīng)過自己的研究和參考網(wǎng)上的案例,對MVP設(shè)計模式也有了一定的了解,今天把自己的一些想法分享出來
參考:
泡在網(wǎng)上的日子
鴻洋的博客

MVC模式:

什么是MVC模式?MVC模式是一種在開發(fā)當(dāng)中常見的設(shè)計模式,通過視圖,模型和控制層的拆分設(shè)計,使得開發(fā)更加容易,后期也更加好維護

-M:Model(模型)Model主要是各種操作,數(shù)據(jù)結(jié)構(gòu),業(yè)務(wù)邏輯和功能的實現(xiàn)等
-V:View(視圖)View就是在layout下的各種布局文件,這個相信很容易理解
-C:Controller(控制器)Controller就是各種Activity或Fragment,這個也很容易

三者的關(guān)系:

如圖:

MVC

我們很容易看到他們?nèi)咧g都是有聯(lián)系的,在開發(fā)中怎么設(shè)計呢?例如用戶登錄功能,xml布局文件就是view層,LoginActivity就是Controller層,model層就是登錄的方法,通過btn.setOnClickListener()方法調(diào)用model層的登錄方法,就完成了一個登錄的功能,這就是MVC的設(shè)計模式

但是,有個問題,很多時候我們的需求并不只是簡簡單單的一個登錄功能,還有很多復(fù)雜的處理,比如我們想在登錄完成后,把當(dāng)前的頁面的Logo隱藏,又或者替換掉當(dāng)前頁面的背景,按道理來說,這些關(guān)于頁面的操作是在布局頁面,也就是View層,但是這些都不能再xml中去實現(xiàn),只能在Activity中操作,但是Activity是屬于Controller層啊,這就導(dǎo)致了Activity既是Controller層又是View層,講道理,如果代碼越來越多,邏輯越來越復(fù)雜,這就很尷尬了,不禁寫的麻煩,維護更加頭疼,還有,view層和model層是互通的,這就說明兩者存在耦合性,如果是個大型的項目,顯然,這是非常不好的,這就衍生出了MVP設(shè)計模式


MVP模式:

什么是MVP模式?MVP模式是MVC模式的進化,解決很多MVC的一些設(shè)計缺點,比如耦合性

-M:Model(模型)跟MVC的一樣
-V:View(視圖)各種Activity或Fragment,這跟MVC的有點差別了
-P:Presenter(主導(dǎo)期)處理用戶觸發(fā)事件

三者的關(guān)系:

如圖:

MVP

相對MVC來言,我們發(fā)現(xiàn),View和Model之間沒有直接的聯(lián)系,而是通過Presenter進行連接,MVP模式舍去了xml布局所在的層,并把改層放置的是Activity或是Fragment,這樣,解除了MVC的耦合性的問題,對于這三者的溝通,我們主要是通過接口的方式實現(xiàn),還是以登錄功能為例,首先,我們在Model層以接口形式定義一個登錄的方法,然后定義一個類去實現(xiàn)這個方法,而Presenter則去調(diào)用這個方法,然后再View層去調(diào)用Presenter的實現(xiàn)方法,就可以完成了登錄的功能,這就避免了耦合性,也大大的優(yōu)化的代碼,也便于后期的維護

示例代碼:

項目結(jié)構(gòu)圖

LoginUtil類:

public interface LoginUtil { void Login(Context context); }

LoginUtilImp類:

public class LoginUtilImp implements LoginUtil { @Override public void Login(Context context) { Toast.makeText(context,"loging",Toast.LENGTH_SHORT).show(); } }

Logining類:

public class Logining { private LoginUtil mLoginUtil; private Context mContext; public Logining(Context context){ this.mContext=context; this.mLoginUtil=new LoginUtilImp(); } public void login(){ mLoginUtil.Login(mContext); } }

MainActivity類:

mBtnLogin.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { mLogining.login(); } });

總結(jié):

MVC和MVP兩者說到底最大的差別就是耦合性,隨著APP的功能的增強,View層處理的東西越來越多了,為了更好地細(xì)分視圖與模型的功能,所以,MVP設(shè)計模式更切近我們的開發(fā),一個好的項目,往往都是從設(shè)計模式開始,最后,有哪里不足的歡迎指出來

最后編輯于
?著作權(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)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,276評論 25 708
  • 前言 MVC、MVP、MVVM一直以來都是Android應(yīng)用常見的架構(gòu)模式,都是為了抽離出UI邏輯和業(yè)務(wù)邏輯。但是...
    希格斯子閱讀 1,235評論 0 1
  • 相信大家對MVC,MVP和MVVM都不陌生,作為三個最耳熟能詳?shù)腁ndroid框架,它們的應(yīng)用可以是非常廣泛的,但...
    約書亞Luis閱讀 1,312評論 0 13
  • 目錄及簡介 第四章 設(shè)計稿完成的那個晚上,三個人在教室里忙碌。雖然凌苗苗和張尹一直別扭著,但是只要一工作起來,就默...
    林秋千閱讀 394評論 2 2
  • 人類的騙局 先不說騙局不騙局吧,說說人類怎么來的吧。 無論連篇累牘的地理大發(fā)現(xiàn),還是考古研究,還是海洋生物學(xué),基因...
    菱角滿塘閱讀 264評論 0 1

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