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个要素: