MVP模式是MVC模式在Android上的一种变体,要介绍MVP就得先介绍MVC。在MVC模式中,Activity应该是属于View这一层。而实质上,它既承担了View,同时也包含一些Controller的东西在里面。这对于开发与维护来说不太友好,耦合度大高了。把Activity的View和Controller抽离出来就变成了View和Presenter,这就是MVP模式


我在自己的项目里也使用了这个设计模式。当项目越来越庞大、复杂,参与的研发人员越来越多的时候,MVP 模式的优势就充分显示出来了。

MVP模式(Model-View-Presenter)可以说是MVC模式(Model-View-Controller)在Android开发上的一种变种、进化模式。要介绍MVP模式,就不得不先说说MVC模式。


MVC模式的结构分为三部分,实体层的Model,视图层的View,以及控制层的Controller。


  • 其中View层其实就是程序的UI界面,用于向用户展示数据以及接收用户的输入

  • 而Model层就是JavaBean实体类,用于保存实例数据,一些数据模型

  • Controller控制器用于更新UI界面和数据实例

View层接受用户的输入,然后通过Controller修改对应的Model实例;同时,当Model实例的数据发生变化的时候,需要修改UI界面,可以通过Controller更新界面。View层也可以直接更新Model实例的数据,而不用每次都通过Controller,这样对于一些简单的数据更新工作会变得方便许多。

总而言之,M是模型层,是存放数据模型的。V是视图层,用于展示数据的。C是控制层,用于管理更新界面用的。 下面来说一下MVP模式:
按照MVC的分层,Activity和Fragment应该属于View层,用于展示UI界面,以及接收用户的输入,此外还要承担一些生命周期的工作。Activity是在Android开发中充当非常重要的角色,特别是TA的生命周期的功能,所以开发的时候我们经常把一些业务逻辑直接写在Activity里面,这非常直观方便,代价就是Activity会越来越臃肿,超过1000行代码是常有的事,而且如果是一些可以通用的业务逻辑,比如用户登录,写在具体的Activity里就意味着这个逻辑不能复用了。如果有进行代码重构经验的人,看到1000+行的类肯定会有所顾虑。这样一来V和C就耦合在一起了,虽然这样写方便,但是如果业务调整的话,要维护起来就难了,而且在一个臃肿的Activity类查找业务逻辑的代码也会非常蛋疼,所以看起来有必要在Activity中,把View和Controller抽离开来,而这就是MVP模式的工作了。
MVP把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成Presenter接口,Model类还是原来的Model 这就是MVP模式,现在这样的话,Activity的工作的简单了,只用来响应生命周期,其他工作都丢到Presenter中去完成。从上图可以看出,Presenter是Model和View之间的桥梁,为了让结构变得更加简单,View并不能直接对Model进行操作,这也是MVP与MVC最大的不同之处。
MVP模式的作用有啥呢?
  • 分离了视图逻辑和业务逻辑,降低了耦合

  • Activity只处理生命周期的任务,代码变得更加简洁

  • 视图逻辑和业务逻辑分别抽象到了View和Presenter的接口中去,提高代码的可阅读性

  • Presenter被抽象成接口,可以有多种具体的实现,所以方便进行测试

简单来说一下MVP:M也是模型层,用于存放数据模型的,V也是视图层用于展示数据的,P是Presenter,用于管理模型层和view层,相当于架于两者之间的桥梁。 下面来介绍一下代码: 这就是 MVP模式的包和类。基本就是定义一个接口类,在定义一个实现类。把所有的方法都写到接口里面,然后在实现类里面重写接口的方法进行使用。这样一来,界面清晰,方便与开发和维护。
然后来看一下bean类,封装了一个登陆用的用户名和密码:
public class UserInfo {    private String name;    private String pass;    public UserInfo(String name, String pass) {        this.name = name;        this.pass = pass;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getPass() {        return pass;    }    public void setPass(String pass) {        this.pass = pass;    }}


再来看一下model层的接口类:
public interface IUserLoginModel {    // 登录的方法    public void login(String name,String pass);    // 保存用户名和密码的方法    public void saveUserInfo(String name,String pass);    // 取出用户名和密码的方法  要取出就得返回一个UserInfo  getUserInfo是返回值    public UserInfo getUserInfo();}

接下来是model层的实现类:
public class UserLoginModel implements IUserLoginModel {    @Override    public void login(String name,String pass) {    }    @Override    public void saveUserInfo(String name, String pass) {    }    @Override    public UserInfo getUserInfo() {        return null;    }}


View层的接口类:在这里,我没有写View层的实现类。
public interface IUserLoginView {    // 给文本框赋值的方法 设置    public void setTextName(String name);    public void setTextPass(String pass);    // 取文本框值的方法    public String getTextName();    public String getTextPass();}


最后来看一下Presenter类:
public class LoginPresenter {    IUserLoginModel model;    IUserLoginView view;    Context context;    public LoginPresenter(IUserLoginView view, Context context) {        this.view = view;        this.context = context;        model = new UserLoginModel();    }    // 登陆方法  最终是要在Activity中调用的    public void login(){        // 想要登录 就得把用户名密码得到        // 取出输入框中的用户名和密码        final String name = view.getTextName();        final String pass = view.getTextPass();        if(!name.equals("123")){            Toast.makeText(context,"用户名错误",Toast.LENGTH_SHORT).show();            return;        }        new AsyncTask,String,Integer>(){            @Override            protected void onPostExecute(Integer integer) {                Toast.makeText(context,"登录成功",Toast.LENGTH_SHORT).show();                super.onPostExecute(integer);            }            @Override            protected Integer doInBackground(String... strings) {                model.login(name,pass);                return null;            }        }.execute();    }}


以上就是我对MVP的简单的一些理解,总之MVP对于多人开发来说是比较好的一种模式了,方便多人开发,易维护。

更多相关文章

  1. Android中 AIDL 的简单实用例子
  2. Android(安卓)Service更新UI的方法之AIDL
  3. android中简单搞定webservice接口访问,以及webservice简析
  4. Android:IPC之AIDL的学习和总结
  5. Android(安卓)常用设计模式
  6. Android解析中国天气接口JSon数据,应用于天气查询
  7. Android自带音乐播放器代码分析(1)
  8. 从MediaStore获取制定文件夹下的视频信息
  9. Activity启动模式 及 Intent Flags 与 栈 的关联分析

随机推荐

  1. 人类语言的表现形式和规则
  2. 如何查询谷歌地球卫星数据源
  3. 使用语音包合成你想说的话-文字转语音
  4. arc_loss训练手写数字分类
  5. mysql5.7安装
  6. mysql5.7密码设置
  7. mysql5.6升级及mysql无密码登录
  8. mysql多实例安装与ssl认证
  9. mysql的数据类型和字符集
  10. mysql中生成列与JSON类型的索引