android mvp设计模式

什么是MVP

MVP,全称 Model-View-Presenter。要说MVP那就不得不说一说它的前辈——MVC(Model-View-Controller,模型-视图-控制器)。java

  • View:对应于布局文件
  • Model:业务逻辑和实体模型
  • Controllor:对应于Activity

细细的想一想这个View对应于布局文件,其实能作的事情特别少,实际上关于该布局文件中的数据绑定的操做,事件处理的代码都在Activity中,形成了Activity既像View又像Controller。程序员

而当将架构改成MVP之后,Presenter的出现,将Actvity视为View层,Presenter负责完成View层与Model层的交互,其实就是activity里边只作和UI相关的操做,即更新UI的功能,具体何时更新,更新的数据,则是由presenter和model来决定,presenter决定何时更新并将model层的数据传送到activity。如今是这样的:架构

  • View 对应于Activity,负责View的绘制以及与用户交互
  • Model 依然是业务逻辑和实体模型
  • Presenter 负责完成View于Model间的交互

这样的转变是从并不标准的MVCMVP的一个转变,减小了Activity的职责,简化了Activity中的代码,将复杂的逻辑代码提取到了Presenter中进行处理。与之对应的好处就是,耦合度更低,更方便的进行测试。借用两张图,表明上述的转变:
image
转变为:
imagemvc

MVP与MVC的区别

最明显的区别就是,MVC中是容许Model和View进行交互的,而MVP中很明显,Model与View之间的交互由Presenter完成。以下图所示:
image框架

为何须要MVP

  • 一、尽可能简单

大部分的安卓应用只使用View-Model结构,程序员如今更多的是和复杂的View打交道而不是解决业务逻辑。当你在应用中只使用Model-View时,到最后,你会发现“全部的事物都被链接到一块儿”。ide

而使用MVP则会把复杂的任务分红细小的任务,而且很容易解决。越小的东西,bug越少,越容易debug,更好测试。在MVP模式下的View层将会变得简单,因此即使是他请求数据的时候也不须要回调函数。View逻辑变成十分直接。函数

  • 2:后台任务

当你编写一个Actviity、Fragment、自定义View的时候,你会把全部的和后台任务相关的方法写在一个静态类或者外部类中。这样,你的Task再也不和Activity联系在一块儿,这既不会致使内存泄露,也不依赖于Activity的重建。组件化

MVP的优缺点

优势:布局

  1. 下降耦合度,实现了Model和View真正的彻底分离,能够修改View而不影响Modle
  2. 模块职责划分明显,层次清晰
  3. 隐藏数据
  4. Presenter能够复用,一个Presenter能够用于多个View,而不须要更改Presenter的逻辑(固然是在View的改动不影响业务逻辑的前提下)
  5. 利于测试驱动开发。之前的Android开发是难以进行单元测试的(虽然不少Android开发者都没有写过测试用例,可是随着项目变得愈来愈复杂,没有测试是很难保证软件质量的;并且近几年来Android上的测试框架已经有了长足的发展——开始写测试用例吧),在使用MVP的项目中Presenter对View是经过接口进行,在对Presenter进行不依赖UI环境的单元测试的时候。能够经过Mock一个View对象,这个对象只须要实现了View的接口便可。而后依赖注入到Presenter中,单元测试的时候就能够完整的测试Presenter应用逻辑的正确性。
  6. View能够进行组件化。在MVP当中,View不依赖Model。这样就可让View从特定的业务场景中脱离出来,能够说View能够作到对业务彻底无知。它只须要提供一系列接口提供给上层操做。这样就能够作到高度可复用的View组件。
  7. 代码灵活性

缺点:单元测试

  1. Presenter中除了应用逻辑之外,还有大量的View->Model,Model->View的手动同步逻辑,形成Presenter比较笨重,维护起来会比较困难。
  2. 因为对视图的渲染放在了Presenter中,因此视图和Presenter的交互会过于频繁。
  3. 若是Presenter过多地渲染了视图,每每会使得它与特定的视图的联系过于紧密。一旦视图须要变动,那么Presenter也须要变动了。
  4. 额外的代码复杂度及学习成本。

demo以下:

目录:

具体每一个类的代码:

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

  • View :负责绘制UI元素、与用户进行交互(在Android中体现为Activity);
  • View interface :须要View实现的接口,View经过View interface与Presenter进行交互,下降耦合,方便进行单元测试;
  • Model :负责存储、检索、操纵数据(有时也实现一个Model interface用来下降耦合);
  • Presenter :做为View与Model交互的中间纽带,处理与用户交互的负责逻辑。
相关文章
相关标签/搜索