Android中的MVP模式入门解析

2024-05-07 08:32
文章标签 android 模式 入门 解析 mvp

本文主要是介绍Android中的MVP模式入门解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

初衷

说实话,每次面试的时候,都会被问及Android的开发模式,我们用的无非就是MVC、MVP、MVVM等,有的开发者,干脆直接使用普通架构,就是,我干脆什么模式都不用,写一步看一步,最后导致自己的项目动一步则动全身,项目维护起来比较困难,导致后期新加入的同事不愿意去维护自己的项目,所以我们可以通过这些开发模式,来提高我们项目的可维护性

网上也有很多的大神,为我们讲解了MVP的搭建过程,但是我还是想再跟大家捋一捋,也算是加深一下印象,哈哈。。。好了,说了这么多,我们先来看一张图吧:

MVP结构示意图

看了这张图,大家应该有所领悟,就算不懂,应该也在心里有点想法了,其实我们很多人有时候会误以为MVC和MVP其实差不多,但是,用了之后,再加上理解,你会发现,其实他们还是有本质区别的,MVP在一定程度上解耦了Activity中的试图和逻辑的关系,将他们分开,把所有的逻辑交由Presenter去处理,然后再通知Model去更新数据,然后显示在View中。

这样做的好处是什么?说句白话,就是方便后期维护,我们在更改数据的时候,就不用再去管Activity中的代码了,直接去Presenter中更改逻辑就好了,是不是很方便,话虽然不多,可能会有点绕,有时候每个人的理解也不一样,所以有可能会造成误区,我们用代码来说说,大家就会有一定的理解了

概述

我们用一些代码来讲讲,MVP模式的好处在哪里?

先让我们来看一下效果图吧,很简单:

MVP模式效果图

其实很简单,就是保存两个参数,然后在显示出来,好吧,既然看到效果了,那大家是不是也很迫不及待的试一试呢?没关系,接下来我就告诉大家,如何搭建MVP架构模式,来完成Android项目基础架构搭建:

首先我们来看一下,项目的结构:

这里写图片描述

看起来就是这么回事,我创建了三个包名,分别是:Model,View,Presenter分别对应M,V,P,MVP的主要目的就是解耦业务逻辑和视图逻辑,接下来,我们看思路:

Model
也就是我们说的实体类,这个不多说肯定要有的,代码没啥,看一下就好了:
  1. UserBean.java
/*** Created by donny on 2017/10/9.*/public class UserBean {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
  1. User.java
/*** Created by donny on 2017/10/9.*/public class User implements IUser {private UserBean bean;@Overridepublic void SaveUserInfo(UserBean user) {this.bean = user;}@Overridepublic UserBean LoadUserInfo() {if (bean != null){return bean;}return null;}
}
  1. IUser.java
/*** Created by donny on 2017/10/9.*/public interface IUser {void SaveUserInfo(UserBean user);UserBean LoadUserInfo();
}
这里大家要注意一下,IUser里面主要是接口,首先,我们要想好,在Presenter中要实现哪些逻辑,要用到哪些方法,然后就在这里定义哪些方法。User主要是IUser的实现,返回一些数据,具体返回那些数据,就有大家自己去根据实际情况而定了。
View
  1. IUserView.java
/*** Created by donny on 2017/10/9.*/public interface IUserView {UserBean getUser();void setUser(UserBean bean);
}

大家可以看一下,IUserView这个类里面的方法,很明显,一个是拿到数据,一个是把数据给别人,我们需要让我们的Activity去实现这个接口里面的方法,然后去做一些数据的显示或者获取。

上面我们说过,Presenter与View交互是通过接口。所以我们这里需要定义一个IUserView,难点就在于应该有哪些方法,我们看一眼效果图会发现一个是保存,一个是载入,所以我们就创建两个方法,分别是:getUser和setUser;

  1. MainActivity.java
package com.heytz.mvpdemo;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;import com.heytz.mvpdemo.modle.UserBean;
import com.heytz.mvpdemo.presenter.UserPresenter;
import com.heytz.mvpdemo.view.IUserView;public class MainActivity extends AppCompatActivity implements IUserView {EditText edt_id, edt_name;Button btn_load, btn_save;TextView tv_show;UserPresenter presenter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);presenter = new UserPresenter(this);initView();initEvent();}private void initEvent() {btn_load.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {presenter.loadUser();}});btn_save.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {presenter.saveUser();Toast.makeText(MainActivity.this, "保存完成", Toast.LENGTH_SHORT).show();}});}private void initView() {edt_id = (EditText) findViewById(R.id.edt_id);edt_name = (EditText) findViewById(R.id.edt_name);btn_load = (Button) findViewById(R.id.btn_load);btn_save = (Button) findViewById(R.id.btn_save);tv_show = (TextView) findViewById(R.id.tv_show);}@Overridepublic UserBean getUser() {int id = Integer.valueOf(edt_id.getText().toString().trim());String name = edt_name.getText().toString().trim();if (name != null) {UserBean bean = new UserBean();bean.setId(id);bean.setName(name);return bean;}return null;}@Overridepublic void setUser(UserBean bean) {if (bean != null) {tv_show.setText(bean.getId() + "\n" + bean.getName());}}
}
Presenter
这个才是我们今天的主角,先给大家看一下他的代码,虽然不多,但是它是连接Activity和Model的重要桥梁,所有的业务逻辑都在它里面完成:
  1. UserPresenter.java
package com.heytz.mvpdemo.presenter;import com.heytz.mvpdemo.modle.IUser;
import com.heytz.mvpdemo.modle.User;
import com.heytz.mvpdemo.view.IUserView;/*** Created by donny on 2017/10/9.*/public class UserPresenter {private IUserView userView;private IUser user;public UserPresenter(IUserView view) {this.userView = view;user = new User();}public void saveUser() {user.SaveUserInfo(userView.getUser());}public void loadUser() {userView.setUser(user.LoadUserInfo());;}
}

Presenter是用作Model和View之间交互的桥梁,那么应该有什么方法呢?

大家看到了,IUserview中主要有两个实现方法,主要用来实现从Activity中拿到数据,然后交给User这个类去进行操作,User类实现了IUser的接口,所以我们要在User类中实现一些对UserBean的操作,只要知道怎么去定义方法,如何操作,那么MVP模式其实不难
注意上述代码,其实我们的presenter要完成二者的交互,那么肯定需要二者的实现类。大致就是从View中获取需要的参数,交给Model去执行业务方法,执行的过程中需要的反馈,以及结果,再让View进行做对应的显示。

ok,我通过一个例子给大家分析了一下mvp架构搭建的过程,以上也是我对MVP的一个理解,如果大家有什么问题,欢迎留言和讨论,虽然有很多大神写了这方面的文章,但是每个人的理解可能会有偏差,所以我还是把自己的想法又写了一遍,欢迎大家讨论和吐槽。

最后附上demo下载地址

这篇关于Android中的MVP模式入门解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/966840

相关文章

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决