MVP模式

概念就不说了,大家都懂。View层通过Persenter层相互通信,避免了View中大量的业务代码,而将其提取到Model中。其实简单的来说,就是通过接口回调,把业务分离出去。提高代码的可读性和已维护性。

直接看案例就明白了。

案例(用户登录)

常规的用户登录写法就是Activity(fragment)中获取用户名密码,网络请求登录接口,返回是否登录成功

而MVP的模式就是,要把网络请求这一部分单独提取出来放到model层里面,View层也就是我们的Activity只写页面相关的操作,

  • 创建LoginModel如下:
package com.cyq.mvppractice.model;

public class LoginModel {

    public static boolean login(String username, String password) {
//一般是请求网络接口咯
//具体逻辑我就不写了,这里模拟一下,直接返回登录成功
return true;
}
}

很简单,就是一个常规类和常规操作而已,处理具体的登录网络请求

  • 定义一个接口LoginInterface和LoginPersenter类

    LoginInterface中又定义了两个接口,View和Persenter分别继承这两个接口,实现View和Persenter层的交互,具体如下
package com.cyq.mvppractice.contract;

public interface LoginInterface {
/**
* View层需要继承这个接口,通过接口方法View层获取返回结果
*/
interface View {
//判断是否登录成功
void isLogin(boolean islogin);
} /**
* persenter需要继承的接口,通过接口方法传入View层的值
*/
interface Persenter {
//model层需要哪些传入数据从这个接口传入
void goLogin(String username, String password);
}
}

LoginPersenter.class

package com.cyq.mvppractice.persenter;

import com.cyq.mvppractice.contract.LoginInterface;
import com.cyq.mvppractice.model.LoginModel; public class LoginPersenter implements LoginInterface.Persenter {
//通过构造方法传入view,相当于传入了activity和fragment
private LoginInterface.View view; public LoginPersenter(LoginInterface.View view) {
this.view = view;
} /**
* 调用model层业务,最终通过view.isLogin(b),通知view层获取数据
*
* @param username
* @param password
*/
@Override
public void goLogin(String username, String password) {
boolean isLogin = LoginModel.login(username, password);
//回调通知View层
view.isLogin(isLogin);
}
}

最后在View中继承LoginInterface.View接口,实例化LoginInterface.Persenter接口

package com.cyq.mvppractice;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast; import com.cyq.mvppractice.contract.LoginInterface;
import com.cyq.mvppractice.persenter.LoginPersenter; public class LoginActivity extends AppCompatActivity implements LoginInterface.View {
private LoginInterface.Persenter mPersenter;
private EditText usernameEt, passwordEt; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
mPersenter = new LoginPersenter(this);
usernameEt = findViewById(R.id.et_username);
passwordEt = findViewById(R.id.et_password);
findViewById(R.id.btn_login).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String usernameStr = usernameEt.getText().toString();
String passwordStr = passwordEt.getText().toString();
if ((!TextUtils.isEmpty(usernameStr)) && (!TextUtils.isEmpty(passwordStr)))
mPersenter.goLogin(usernameStr, passwordStr);
else {
Toast.makeText(LoginActivity.this, "请输入用户名或密码", Toast.LENGTH_SHORT).show();
}
}
});
} @Override
public void isLogin(boolean islogin) {
if (islogin) {
Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
}
}
}
  • 就这么简单,把网络请求数据库操作等复杂业务单独放到model层中处理,通过接口回调获得model处理结果返回到View层,也就避免了在View层编写大量的业务逻辑了
  • Xml布局如下,就是两个Edittext和一个登陆按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp"
tools:context=".LoginActivity"> <EditText
android:id="@+id/et_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名" /> <EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:hint="请输入密码" /> <Button
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="登录" />
</LinearLayout>
  • 没看懂?再认真看一遍,再写个小demo就ok了,主要是理解其思想

Android MVP模式就是这么回事儿的更多相关文章

  1. Android MVP模式

    转自http://segmentfault.com/blogs,转载请注明出处Android MVP Pattern Android MVP模式\[1\]也不是什么新鲜的东西了,我在自己的项目里也普遍 ...

  2. android MVP模式介绍与实战

    android MVP模式介绍与实战 描述 MVP模式是什么?MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数 ...

  3. Android MVP模式 简单易懂的介绍方式

    主要学习这位大神的博客:简而易懂 Android MVP模式 简单易懂的介绍方式 https://segmentfault.com/a/1190000003927200

  4. Android MVP模式简单易懂的介绍方式 (三)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 讲完M和P,接下来就要讲V了.View ...

  5. Android MVP模式简单易懂的介绍方式 (二)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 上一篇文章我们介绍完了Model的创建 ...

  6. Android MVP模式简单易懂的介绍方式 (一)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 最近正在研究Android的MVP模式 ...

  7. Android MVP模式 谷歌官方代码解读

    Google官方MVP Sample代码解读 关于Android程序的构架, 当前(2016.10)最流行的模式即为MVP模式, Google官方提供了Sample代码来展示这种模式的用法. Repo ...

  8. Android mvp模式、mvvm模式

    MVC和MVP的区别2007年08月08日 星期三 上午 09:23 MVC和MVP到底有什么区别呢? 从这幅图可以看到,我们可以看到在MVC里,View是可以直接访问Model的!从而,View里会 ...

  9. Xamarin.Android MVP模式

    一.简介 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数 据的可视化以及与用户的交互,同时让Model只 ...

随机推荐

  1. 添加新内容的四个 jQuery 方法:append,prepend,after,before

    添加新内容的四个 jQuery 方法区别如下: append() - 在被选元素(里面)的结尾插入内容prepend() - 在被选元素(里面)的开头插入内容 //jQuery append() 方法 ...

  2. c#调用R

    R.NET使用文档 介绍 本页面涉及R.NET1.5.13. 1.5.13版本在功能上等同于1.5.12,但可作为一个包在NuGet.org上获得. R.NET使.NET框架与R统计语言在同一进程进行 ...

  3. 【原创】SSRS (SQL Serve Reporting Service) 访问权限的问题

    问题:The permissions granted to user 'TOUCHPOINTMED\sshi' are insufficient for performing this operati ...

  4. Java之IO(九)其它字节流

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7063161.html 1.前言 之前的章节已经介绍了java的io包中所有成对(输入.输出对应)的字节流,本章介 ...

  5. MySQL 5.7.14 win10安装

    1. 下载: http://dev.mysql.com/downloads/mysql/

  6. css设置:图片文字等不能被选择

    -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;

  7. Spring4.x所有Maven依赖

    Spring4.x所有Maven依赖 定义Spring版本号 1 <properties> 2 <org.springframework.version>4.3.7.RELEA ...

  8. HTML自己整理

    1.margin:0 auto 表示什么意思?? margin后面如果只有两个参数的话,第一个表示top和bottom,第二个表示left和right因为0 auto,表示上下边界为0,左右则根据宽度 ...

  9. ibatis中的cdata和xml中cdata的含义

    ibatis的cdata用于sqlmap文件中,二sqlmap本身就是xml文件,即解析cdata的方法与xml文件的cdata相同. 简单来说:cdata就是用来表明纯文本的,如果没有这个的话 &l ...

  10. java字符串应用之表达式解析器

    一.表达式的组成    1.数字    2.运算符:+ - / * ^ % =    3.圆括号    4.变量二.运算符优先级    由高到低分别为:+-(正负号).^.*/%.+-.=    优先 ...