### MVP簡介 >MVP 全稱:Model-View-Presenter ;MVP 是從經典的模式MVC演變而來,它們的基本思想有相通的[地方](https://baike.baidu.com/item/%E5%9C%B0%E6%96%B9/2262175):Controller/Present ...
### MVP簡介 >MVP 全稱:Model-View-Presenter ;MVP 是從經典的模式MVC演變而來,它們的基本思想有相通的[地方](https://baike.baidu.com/item/%E5%9C%B0%E6%96%B9/2262175):Controller/Presenter負責邏輯的處理,Model提供數據,View負責顯示。 對於MVC不瞭解的朋友可以查此文: [Android進階之路(1)-詳解MVC](https://www.jianshu.com/p/285f6a8d971f) **Android中的MVP:** - M層:適合做一些業務邏輯處理,比如資料庫存取操作,網路操作,複雜的演算法,耗時的任務等都在model層處理。和MVC類似 - V層:對應的Activity,負責xml繪製與頁面交互 - P層:負責View與Model之間的交互 ![](https://img2018.cnblogs.com/blog/1312938/201909/1312938-20190901084219353-399431689.png) ### 為什麼要用MVP 我們先想想上篇文章,我們講到為什麼要用MVC,當時我們總結了幾點: - 代碼復用 - 耦合性低 - 方便維護的高等 然而我們在寫MVC項目時候,也發現了一些問題: 1.對於Android中的Activity或者Fragment ,我們不能很清晰的區分它是View還是Controller,既有交互又有頁面繪製,這就導致了activity和fragment很“龐大” 2.View與Model確實是分離的,但是關聯性太強,這就導致activity與model的聯繫強,這樣我們只要改一點點代碼, model 、view、activity 都會變,維護成本太高,View與Model之前的耦合性太高。 而MVP最大的改變就是View與Model實現完全隔離。View把操作意圖給P層,P收到後,會調用Model層來實現具體的邏輯, 邏輯實現後會再通知給P, P再通過View的介面回調給View。即便V和M更改了,也不會有影響,耦合性低。 ### MVP DEMO 以登錄模塊為例,來實現MVP **1.定義View介面- ILoginView** ``` /** * 獲取view層的dialog * * @return retuen */ Dialog getLoadDialog(); /*** * 關閉view層的dialog */ void cancelLoadDialog(); /** * 獲取手機號參數 * * @return username */ String getPhone(); /** * 獲取密碼 * * @return password */ String getCode(); /** * 彈出消息 * * @param msg msg */ void showMsg(String msg); ``` View介面大家都明白吧?就是你要告訴給P的意圖。activity實現此介面。並調用P的方法: ``` @Override public void cancelLoadDialog() { if (dialog!=null&&dialog.isShowing()){ dialog.dismiss(); } } @Override public String getPhone() { return edPhone.getText().toString(); } @Override public String getCode() { return edCode.getText().toString(); } @Override public void showMsg(String msg) { Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_SHORT).show(); } ``` ``` mPresenter.login(); ``` **2.定義Model與ModelImpl** Model: ``` public interface ILoginModel { void login(String phone, String code, OnLoadDatasListener