android MVP——mvp架构的应用和优化

MVP架构在android还是很好用的。我也在试着将mvp用在项目中。

下面我就来说说mvp模式的应用和优化。

mvp模式的概念

MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。

比较

mvc:

1,在MVC里,View是可以直接访问Model的,View里会包含Model信息,不可避免的还要包括一些业务逻辑。
2,Model不依赖于View,但是View是依赖于Model。
3,有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。

mvp:

1,在MVP里,Presenter完全把Model和View进行了分离,主要的程序逻辑在Presenter里实现。
2,Presenter与具体的View是没有直接关联的,而是通过定义好的接口进行交互。从而使得在变更View时候可以保持Presenter的不变,即重用
3,应用程序的逻辑主要在Presenter来实现,其中的View是很薄的一层。这样一来就编写测试用的View,模拟用户的各种操作,从而实现对Presenter的测试

mvp的系统设计

我们先来个mvp系统的设计。(我们在这里模仿一个登陆的请求)
概要设计图
这里写图片描述

1,mobel层

mobel接口:规定操作数据的接口。

接口:IUserLoginMobel

/**
 * 用户操作接口 Model 业务层接口
 */
public interface IUserLoginMobel{
   
    /**
     * 用户登录
     *
     * @param name
     * @param pwd
     * @param loginListener
     */
    void login(String name, String pwd, OnLoginListener loginListener);
}

登录状态回调接口:

/**
 * 登陆状态接口
 */
public interface OnLoginListener {
   
    void loginSuccess(UserInfoBean user);

    void loginFailed(String message);
}

类:用户登陆操作类 UserLoginModel

/**
 * 用户登陆操作类,Model 业务层(接收数据,处理出局)
 */
public class UserLoginModel implements IUserLoginMobel {
   
    @Override
    public void login(final String name, final String pwd, final OnLoginListener loginListener) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                    if ("admin".equals(name) && "admin".equals(pwd)) {
                        UserInfoBean userInfoBean = new UserInfoBean();
                        userInfoBean.setUserId(System.currentTimeMillis());
                        userInfoBean.setUserName(name);
                        userInfoBean.setUserPwd(pwd);
                        loginListener.loginSuccess(userInfoBean);
                    } else {
                        loginListener.loginFailed("密码错误");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

2,Presenter层

定义 UserLoginPresenter类

/**
 * 用户登录的任命者。Presenter (用于接收模型发出的结果,给view层发送命令)
 */
public class UserLoginPresenter  {
   
    protected IUserLoginView mvcView;//view的接口
    private IUserLoginMobel userLoginMobel;//mobel的接口
    private Handler mHandler = new Handler();

    public UserLoginPresenter(IUserLoginView userLoginView) {
        this.mvcView = userLoginView;
        this.userLoginMobel = new UserLoginModel();//实例化用户登录业务层
    }

    public void login() {
        mvcView.showLoading();
        userLoginMobel.login(mvcView.getUserName(), mvcView.getPassword(), new OnLoginListener() {
            @Override
            public void loginSuccess(final UserInfoBean user) {
                //需要在UI线程执行
                mHandler.post(
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值