前言
最近在研究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)系:
如圖:

我們很容易看到他們?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)系:
如圖:

相對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)化的代碼,也便于后期的維護
示例代碼:

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(); } });