浅谈Android中MVP设计模式

 1.MVP是众所周知MVC模式的一个演变,他们的主要目的都是划分模块职责,降低模块耦合性,易测试 ,挺高代码复用性。

    从不标准的MVC到MVP一个转变,减少了Activity的职责,简化了Activity中的代码,将复杂的逻辑代码提取到Presenter中进行处理,Mvp模式,Presenter的出现,将

   Activity视为View层,Presenter负责完成View层与Model层的交互。

1.Model: 负责数据的检索,持久化等操作。 

2.View : 负责UI的绘制和用户的交互。  

3.Prsenter:作为Model和View的中间协调部分,负责两者之间的业务逻辑处理。


2.与MVC模式的区别

MVP模式与MVC模式从层级数据流向上来说一个主要的区别应该就是:MVC模式允许View层和Model层直接通讯



                                          MVC模式


                                           MVP模式


                                  MVP与MVC的区别

MVC中允许Model和View进行交互的,而MVP中很明显,Model与View之间的交互由Presenter完成,并且Presenter与View之间的交互式通过接口实现。



Demo演练

 

                    图(1) mvp目录结构

1.按照mvp模式进行模块划分 

首先创建数据层Model层 ,主要工作进行数据的检索与持久化操作 

 A.创建实体类User ,进行数据建模

  
  
  1. package com.qkhl.mvp.mvpdemo.model.bean;
  2. /**
  3. *  作者:gaoyin
  4. *  电话:18810474975
  5. *  邮箱:18810474975@163.com
  6. *  版本号:1.0
  7. *  类描述:
  8. *  备注消息:
  9. *  修改时间:16/7/22 下午3:49
  10. **/
  11. public class User {
  12.      private String username;
  13.     private String password;
  14.    public String getUsername() {
  15.        return username;
  16.    }
  17.    public void setUsername(String username) {
  18.        this.username = username;
  19.    }
  20.    public String getPassword() {
  21.        return password;
  22.    }
  23.    public void setPassword(String password) {
  24.        this.password = password;
  25.    }
  26.    @Override
  27.    public String toString() {
  28.        return "User{" +
  29.                "username='" + username + '\'' +
  30.                ", password='" + password + '\'' +
  31.                '}';
  32.    }
  33. }

B.对业务逻辑进行抽象化  ,这里需要进行登录操作,首先创建业务逻辑有关的接口,抽象类中声明需要实现的业务逻辑方法。

  
  
  1. package com.qkhl.mvp.mvpdemo.model.biz;
  2. /**
  3. *  作者:gaoyin
  4. *  电话:18810474975
  5. *  邮箱:18810474975@163.com
  6. *  版本号:1.0
  7. *  类描述:
  8. *  备注消息:
  9. *  修改时间:16/7/22
  10. **/
  11. public interface ImpUserBiz {
  12.    /**
  13.     *  登录方法
  14.     * @param username
  15.     * @param passwrod
  16.     * @param onLoginListener
  17.     */
  18.  public void login(String username,String passwrod,LoginListener onLoginListener);
  19. }

C.需要对login方法进行回调监听,所以需要定义接口监听,定义LoginListener接口类 

   
   
  1. package com.qkhl.mvp.mvpdemo.model.biz;
  2. import com.qkhl.mvp.mvpdemo.model.bean.User;
  3. /**
  4. *  作者:gaoyin
  5. *  电话:18810474975
  6. *  邮箱:18810474975@163.com
  7. *  版本号:1.0
  8. *  类描述:
  9. *  备注消息:
  10. *  修改时间:16/7/22 下午5:07
  11. **/
  12. public interface LoginListener {
  13. //    登录成功
  14.    public void loginSuccess(User user);
  15. //    登录失败
  16.    public void loginFailed();
  17. }

D.对Model层业务进行实际处理类,所以需要定义实现类UserBiz

   
   
  1. package com.qkhl.mvp.mvpdemo.model.biz;
  2. import com.qkhl.mvp.mvpdemo.model.bean.User;
  3. /**
  4. *  作者:gaoyin
  5. *  电话:18810474975
  6. *  邮箱:18810474975@163.com
  7. *  版本号:1.0
  8. *  类描述:
  9. *  备注消息:
  10. *  修改时间:16/7/22 下午4:00
  11. **/
  12. public class UserBiz implements  ImpUserBiz {
  13.    /**
  14.     *  处理登录逻辑
  15.     * @param username
  16.     * @param passwrod
  17.     * @param onLoginListener
  18.     */
  19.    @Override
  20.    public void login(final String username, final String passwrod, final LoginListener onLoginListener) {
  21.        /**
  22.         *  校验账号和密码是否正确

  23.         */
  24.        new Thread(){
  25.            @Override
  26.            public void run() {
  27.                try {
  28.                    Thread.sleep(2000);
  29.                } catch (InterruptedException e) {
  30.                    e.printStackTrace();
  31.                }
  32.                if("gaoyin".equals(username)&&"12345".equals(passwrod))
  33.                {
  34.                    /**
  35.                     * 登录成功
  36.                     */
  37.                    User mUser=new User();
  38.                    mUser.setUsername(username);
  39.                 mUser.setPassword(passwrod);

  40.                 //回调监听

  41.                    onLoginListener.loginSuccess(mUser);
  42.                }
  43.                else
  44.                {
  45.                    /**
  46.                     *  登录失败
  47.                     */
  48.                    onLoginListener.loginFailed();
  49.                }
  50.            }
  51.        }.start();
  52.    }
  53. }

2.对View层进行模块化实现,View主要工作是进行UI和用户交互。 

A. 对Activity和Fragment需要实现的业务逻辑进行接口抽取,并声明需要实现业务逻辑的方法。

   
   
  1. package com.qkhl.mvp.mvpdemo.view.imp;
  2. import com.qkhl.mvp.mvpdemo.model.bean.User;
  3. /**
  4. *  作者:gaoyin
  5. *  电话:18810474975
  6. *  邮箱:18810474975@163.com
  7. *  版本号:1.0
  8. *  类描述: Activity 业务逻辑接口类
  9. *  备注消息:
  10. *  修改时间:16/7/22 下午4:16
  11. **/
  12. public interface ImpUserLogin {
  13. //   获得用户名称
  14.    public  String  getUserName();
  15. //    获得用户密码
  16.    public String getPasswrod();
  17. //    清除用户名称
  18.    public void clearUserName();
  19. //    清除用户密码
  20.    public void clearPasswrod();
  21. //    登录成功
  22.    public void showSuccess(User user );
  23. //    登录失败
  24.    public void showFailedError();
  25. }

B.进行UI绘制以及用户交互操作 

   
   
  1. package com.qkhl.mvp.mvpdemo.view;
  2. import android.os.Bundle;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.view.View;
  5. import android.widget.Button;
  6. import android.widget.EditText;
  7. import android.widget.Toast;
  8. import com.qkhl.mvp.mvpdemo.R;
  9. import com.qkhl.mvp.mvpdemo.model.bean.User;
  10. import com.qkhl.mvp.mvpdemo.presenter.UserLoginPreseter;
  11. import com.qkhl.mvp.mvpdemo.view.imp.ImpUserLogin;
  12. public class MainActivity extends AppCompatActivity implements ImpUserLogin,View.OnClickListener {
  13. //    用户名称
  14.    private EditText ed_username;
  15. //    用户密码
  16.    private EditText ed_password;
  17. //    登录
  18.    private Button btn_login;
  19. //    清除
  20.    private Button btn_clear;
  21. //    实例化 业务逻辑类
  22.    private UserLoginPreseter mUserLoginPreseter=new UserLoginPreseter(this);
  23.    @Override
  24.    protected void onCreate(Bundle savedInstanceState) {
  25.        super.onCreate(savedInstanceState);
  26.        setContentView(R.layout.activity_main);
  27.        ed_username=(EditText)this.findViewById(R.id.ed_username);
  28.        ed_password=(EditText)this.findViewById(R.id.ed_pwd);
  29.        btn_login=(Button)this.findViewById(R.id.btn_login);
  30.        btn_clear=(Button)this.findViewById(R.id.btn_clean);
  31.        btn_login.setOnClickListener(this);
  32.        btn_clear.setOnClickListener(this);
  33.    }
  34.    @Override
  35.    public String getUserName() {
  36.        return ed_username.getText().toString();
  37.    }
  38.    @Override
  39.    public String getPasswrod() {
  40.        return ed_password.getText().toString();
  41.    }
  42.    @Override
  43.    public void clearUserName() {
  44.        ed_username.setText("");
  45.    }
  46.    @Override
  47.    public void clearPasswrod() {
  48.        ed_password.setText("");
  49.    }
  50.    @Override
  51.    public void showSuccess(User user) {
  52.        Toast.makeText(getApplication(),"登录成功!用户信息为:"+user.toString(),Toast.LENGTH_LONG).show();
  53.    }
  54.    @Override
  55.    public void showFailedError() {
  56.        Toast.makeText(getApplication(),"登录失败",Toast.LENGTH_LONG).show();
  57.    }
  58.    @Override
  59.    public void onClick(View v) {
  60.        switch (v.getId())
  61.        {
  62. //            登录
  63.            case R.id.btn_login:
  64.                mUserLoginPreseter.login();
  65.                break;
  66. //           清除
  67.            case R.id.btn_clean:
  68.                mUserLoginPreseter.clear();
  69.                break;
  70.        }
  71.    }
  72. }

3.创建Presenter,用于连接Model和View层的桥梁,通过Presenter进行数据和事件传递

   
   
  1. package com.qkhl.mvp.mvpdemo.presenter;
  2. import android.os.Handler;
  3. import com.qkhl.mvp.mvpdemo.model.bean.User;
  4. import com.qkhl.mvp.mvpdemo.model.biz.ImpUserBiz;
  5. import com.qkhl.mvp.mvpdemo.model.biz.LoginListener;
  6. import com.qkhl.mvp.mvpdemo.model.biz.UserBiz;
  7. import com.qkhl.mvp.mvpdemo.view.imp.ImpUserLogin;
  8. /**
  9. *  作者:gaoyin
  10. *  电话:18810474975
  11. *  邮箱:18810474975@163.com
  12. *  版本号:1.0
  13. *  类描述: 业务处理--->登录逻辑
  14. *  备注消息:
  15.  *  修改时间:16/7/22 下午4:25
  16. **/
  17. public class UserLoginPreseter {
  18.    private ImpUserBiz mUserBiz;
  19.    private ImpUserLogin mUserLogin;
  20.    private Handler mHandler=new Handler() ;
  21.    public UserLoginPreseter(ImpUserLogin  mUserLogin)
  22.    {
  23.         this.mUserLogin=mUserLogin;
  24.         mUserBiz=new UserBiz();
  25.    }
  26.    /**
  27.     *   登录方法
  28.     */
  29.    public void login()
  30.    {
  31.        mUserBiz.login(mUserLogin.getUserName(), mUserLogin.getPasswrod(), new LoginListener() {
  32. //            登录成功
  33.            @Override
  34.            public void loginSuccess(final User user) {
  35. //                返回主线程,进行回调
  36.                mHandler.post(new Runnable() {
  37.                    @Override
  38.                    public void run() {
  39.                         mUserLogin.showSuccess(user);
  40.                    }
  41.                });
  42.            }
  43. //            登录失败
  44.            @Override
  45.            public void loginFailed() {
  46.                  mHandler.post(new Runnable() {
  47.                      @Override
  48.                      public void run() {
  49.                          mUserLogin.showFailedError();
  50.                      }
  51.                  });
  52.            }
  53.        });
  54.    }
  55.    /**
  56.     *  清除用户信息
  57.     */
  58.    public void  clear()
  59.    {
  60.          mUserLogin.clearUserName();
  61.          mUserLogin.clearPasswrod();
  62.    }
  63. }





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值