简单粗暴之安卓MVP模式

MVP概念

  • M : Model(负责存储、检索、操纵数据)
  • V : View(负责绘制UI元素,与用户进行交互)
  • P : Presenter (是连接Model 和 View 的桥梁)

MVP的作用

  • 将视图逻辑和业务逻辑分离开来,降低耦合
  • Activity只处理声明周期的任务
  • 提高代码的阅读性
  • Presenter被抽象成接口,有多种具体的实现方式
  • 业务逻辑在Presenter中,避免Activity造成内存泄露

MVP的核心思想

  • 将Activity中的视图逻辑抽象成View接口,将业务逻辑抽象成Presenter接口

MVP的使用

  • 根据谷歌官方的mvp写法,以下将用一个用户登录的demo来讲解。
  • github地址:https://github.com/jwllls/MVPDemo.git
  • 步骤如下
  1. 创建BaseView,BasePresenter
  2. 创建LoginContract(创建View 和 presenter,在其中声明方法 )
  3. 创建LoginPresenter(继承Contract 中的 Presenter,具体实现其中的方法)
  4. 创建LoginModel(具体实现数据逻辑,如请求网络数据,数据库中的数据等)

Demo代码说明

项目架构

简单粗暴之安卓MVP模式_第1张图片
mvp.png

BaseView

public interface BaseView {

    void setPresenter(T presenter);  //该方法用于绑定View

}

BasePresenter

public interface BasePresenter {

    void onStart(); //用来进行初始化工作
}

LoginContract

public class LoginContract {

    public interface View extends BaseView {
        //这里可以定义与 View 相关的方法

        void showLoading();  // 显示加载

        void dismissLoading();  // 隐藏加载

        void toastSucMsg(); // 提示登录成功消息

        void toastFailMsg();// 提示登录失败

    }


    public interface Presenter extends BasePresenter {
        // 这里可以定义逻辑相关的方法,如请求网络数据或本地数据库的数据等。

        void userLogin(String username, String password); // 定义一个登录方法, 模拟用户请求网络数据进行登录

    }

}

LoginModel

public class LoginModel {


    //在Model中进行具体的数据操作,如请求网络数据或请求数据库的数据等等。


    /**
     * 在这定义一个获取用户对象的方法
     */
    public User getUser() {

        //假设从服务器上获取到的对象是User,用户名和密码分别是admin和12345

        User user = new User();

        user.setUsername("admin");
        user.setPassword("12345");

        return user;

    }

}

LoginPresenter

public class LoginPresenter implements LoginContract.Presenter {

    private LoginContract.View view;
    private UserModel model;   //用于数据的处理,如网络请求、数据库请求等
    private Activity activity;

    public LoginPresenter(LoginContract.View view, Activity activity) {
        this.view = view;
        this.activity = activity;
        view.setPresenter(this);  //在构造方法中将 Presenter 和 View 绑定
        model = new UserModel();  //创建UserModel对象
    }

    @Override
    public void onStart() {
        // userLogin  可以在onStar( )进行初始化方法
    }

    @Override
    public void userLogin(String username, String password) {

        User user = model.getUserModel();   //模拟获得网络请求返回的用户数据

        view.showLoading();  //显示加载窗

        if (user.getUsername().equals(username) && user.getPassword().equals(password)) {  //加入账号密码正确则登录成功

            new Handler().postDelayed(new Runnable() {  //延迟2秒后执行
                @Override
                public void run() {
                    view.toastSucMsg();     //登录成功提示消息
                    view.dismissLoading();  //关闭加载窗
                    activity.startActivity(new Intent(activity, MainActivity.class));  //跳转到主界面
                }
            }, 2000); 

        } else {

            new Handler().postDelayed(new Runnable() { //延迟1秒后执行
                @Override
                public void run() {
                    view.toastFailMsg();    //登录失败提示消息
                    view.dismissLoading(); //关闭加载窗
                }
            }, 1000);

        }
    }
}

总结

以上代码简单地实现了一个用户登陆的mvp模式,这种模式能够将我们的代码充分解耦,能够很好地对代码进行维护和扩展。但是有些时候我们的需求是一些比较简单的业务逻辑和界面,这时候也可以结合mvc的方式来加快我们的开发速度,因为如果每个界面都要创建Presenter、View等会让代码比较臃肿。

你可能感兴趣的:(简单粗暴之安卓MVP模式)