MVP,全稱 Model-View-Presenter。要說MVP那就不得不說一說它的前輩——MVC(Model-View-Controller,模型-視圖-控制器)。java
細細的想一想這個View對應於佈局文件,其實能作的事情特別少,實際上關於該佈局文件中的數據綁定的操做,事件處理的代碼都在Activity中,形成了Activity既像View又像Controller。程序員
而當將架構改成MVP之後,Presenter的出現,將Actvity視爲View層,Presenter負責完成View層與Model層的交互,其實就是activity裏邊只作和UI相關的操做,即更新UI的功能,具體何時更新,更新的數據,則是由presenter和model來決定,presenter決定何時更新並將model層的數據傳送到activity。如今是這樣的:架構
這樣的轉變是從並不標準的MVC到MVP的一個轉變,減小了Activity的職責,簡化了Activity中的代碼,將複雜的邏輯代碼提取到了Presenter中進行處理。與之對應的好處就是,耦合度更低,更方便的進行測試。借用兩張圖,表明上述的轉變:
轉變爲:mvc
最明顯的區別就是,MVC中是容許Model和View進行交互的,而MVP中很明顯,Model與View之間的交互由Presenter完成。以下圖所示:框架
大部分的安卓應用只使用View-Model結構,程序員如今更多的是和複雜的View打交道而不是解決業務邏輯。當你在應用中只使用Model-View時,到最後,你會發現「全部的事物都被鏈接到一塊兒」。ide
而使用MVP則會把複雜的任務分紅細小的任務,而且很容易解決。越小的東西,bug越少,越容易debug,更好測試。在MVP模式下的View層將會變得簡單,因此即使是他請求數據的時候也不須要回調函數。View邏輯變成十分直接。函數
當你編寫一個Actviity、Fragment、自定義View的時候,你會把全部的和後臺任務相關的方法寫在一個靜態類或者外部類中。這樣,你的Task再也不和Activity聯繫在一塊兒,這既不會致使內存泄露,也不依賴於Activity的重建。組件化
優勢:佈局
缺點:單元測試
目錄:
具體每一個類的代碼:
public interface IContract { interface IPresenter { void getData(); } interface IView { void updateUI(String data); } }
public class MainActivity extends AppCompatActivity implements IContract.IView{ IContract.IPresenter iPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iPresenter = new MyPresenter(this); } @Override public void updateUI(String data) { TextView textView = findViewById(R.id.show_data); textView.setText(data); } }
public class MyPresenter implements IContract.IPresenter { IContract.IView iView; public MyPresenter(IContract.IView iv){ this.iView = iv; } @Override public void getData() { MyModel myModel = new MyModel(); String s = myModel.getData(); } }
public class MyModel { public String getData(){ return "MVP"; } }
在MVP模式裏一般包含4個要素: