学习一下MVP模式

来源:互联网 发布:黑暗之光魔翼升阶数据 编辑:程序博客网 时间:2024/06/06 01:09

MVP与MVC相比:

MVP是从MVC模式演变过来的,MVC模式中,允许View和Model进行通信,而在MVP中则是完全交给了presenter来完成,并且通过接口实现完全解耦。

MVC和MVP图示比较,图片来源(http://blog.csdn.net/lmj623565791/article/details/46596109):

MVC和MVP各层的作用:

MVC:

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

MVP:

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

MVP的优缺点:

优点:

  1. 降低耦合度
  2. 模块职责划分明显
  3. 利于测试驱动开发
  4. 代码复用
  5. 隐藏数据
  6. 代码灵活性

缺点:

  1. 增大代码量

看到很多人都是使用登录的功能来写MVP的,咱也不免俗了。

目录结构:

MVP书写步骤:

JavaBean是不可缺少的了,这里就简单写一个,Demo如果写的太复杂容易让不熟的人一头雾水,最后只会彻底放弃:

public class UserBean {public String name;public String password;}

model层的书写分为OnLoginListener,IUserModel和UserModel。

OnLoginListener担负着监听返回数据的作用,数据类型就是之前定义的UserBean.

public interface OnLoginListener {//UserBean就相当于网络请求回来的数据Beanvoid loginSuccess(UserBean user);void loginFailed();}

IUserModel将login方法暴露给presenter:

public interface IUserModel {    void login(String name, String password, OnLoginListener onLoginListener);}

IUserModel的login方法由其子类UserModel帮其实现:

public class UserModel implements IUserModel {@Overridepublic void login(final String name, final String password, final OnLoginListener onLoginListener) {    //模拟登录操作    new Thread(new Runnable() {        @Override        public void run() {            try {                //模拟请求网络的时间                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }            if ("tom".equals(name) && "123".equals(password)) {                //将数据携带到View层,如果是网络请求就是返回来的数据                UserBean user = new UserBean();                user.name=name;                user.password=password;                onLoginListener.loginSuccess(user);            } else {                onLoginListener.loginFailed();            }        }    }).start();}}

model层已经完成了,现在该书写present层了,该层负责和view层(Activity/Fragment)进行交互。

首先提供一个接口负责和view层进行交互(包括获取数据和更新UI).

public interface IUserLoginPresenter {String getUserName();String getUserPassword();void toMainActivity(UserBean user);void showFailedError();void showLoading();void hideLoading();}

由其子类实现这些方法:

public class UserLoginPresenter {private IUserModel mIUserModel;private IUserLoginPresenter mIUserLoginView;private Handler mHandler = new Handler();//构造方法public UserLoginPresenter(IUserLoginPresenter iUserLoginView) {    this.mIUserLoginView = iUserLoginView;    this.mIUserModel = new UserModel();}public void login() {    mIUserLoginView.showLoading();    mIUserModel.login(mIUserLoginView.getUserName(), mIUserLoginView.getUserPassword(), new OnLoginListener() {        @Override        public void loginSuccess(final UserBean user) {            mHandler.post(new Runnable() {                @Override                public void run() {                    mIUserLoginView.toMainActivity(user);                    mIUserLoginView.hideLoading();                }            });        }        @Override        public void loginFailed() {            mHandler.post(new Runnable() {                @Override                public void run() {                    mIUserLoginView.showFailedError();                    mIUserLoginView.hideLoading();                }            });        }    });}}

最后就是View层了,View层就是Activity,实现IUserLoginPresenter接口,实现未实现的方法。

public class LoginActivity extends AppCompatActivity implements IUserLoginPresenter {private EditText etLoginName, etLoginPassword;private Button btnLoginExc;private ProgressBar pbLoginProgress;private UserLoginPresenter mUserLoginPresenter = new UserLoginPresenter(this);@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    etLoginName = (EditText) findViewById(R.id.et_login_name);    etLoginPassword = (EditText) findViewById(R.id.et_login_password);    btnLoginExc = (Button) findViewById(R.id.btn_login_exc);    pbLoginProgress = (ProgressBar) findViewById(R.id.pb_login_progress);    btnLoginExc.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            //执行login的方法            mUserLoginPresenter.login();        }    });}@Overridepublic String getUserName() {    return etLoginName.getText().toString().trim();}@Overridepublic String getUserPassword() {    return etLoginPassword.getText().toString().trim();}@Overridepublic void toMainActivity(UserBean user) {    Toast.makeText(this, "登陆成功,我是:"+user.name+",我的密码是:"+user.password, Toast.LENGTH_SHORT).show();}@Overridepublic void showFailedError() {    Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();}@Overridepublic void showLoading() {    pbLoginProgress.setVisibility(View.VISIBLE);}@Overridepublic void hideLoading() {    pbLoginProgress.setVisibility(View.GONE);}}

如有错误和不妥,敬请指出,共同进步~

源码下载

0 0