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界面和数据实例
-
分离了视图逻辑和业务逻辑,降低了耦合
-
Activity只处理生命周期的任务,代码变得更加简洁
-
视图逻辑和业务逻辑分别抽象到了View和Presenter的接口中去,提高代码的可阅读性
-
Presenter被抽象成接口,可以有多种具体的实现,所以方便进行测试
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; } }
public interface IUserLoginModel { // 登录的方法 public void login(String name,String pass); // 保存用户名和密码的方法 public void saveUserInfo(String name,String pass); // 取出用户名和密码的方法 要取出就得返回一个UserInfo getUserInfo是返回值 public UserInfo getUserInfo(); }
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; } }
public interface IUserLoginView { // 给文本框赋值的方法 设置 public void setTextName(String name); public void setTextPass(String pass); // 取文本框值的方法 public String getTextName(); public String getTextPass(); }
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,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(); } }