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. iOS 枚举讲解

    枚举增强程序的可读性,用法上还是需要注意的 1.C语言的写法 enum XMPPReconnectFlags { kShouldReconnect = 1 << 0, // If set, ...

  2. Java序列化接口Serializable接口的作用总结

    一.Java序列化接口Serializable的作用: 一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做”持久化”. 对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字 ...

  3. 移植C/C++代码的十个技巧

    这篇文章是我翻译自Top 10 tips for code porting c/c++的一篇小短文,以下是翻译全文,如有错误请留言或查阅原文. 代码的可移植性基本上是指使得源代码能够在不同的平台上编译 ...

  4. phpstorm之自定义代码碎片(tab键自动填充代码)

    打开phpstorm 的设置界面(快捷键ctrl+alt+s) 比如上面的form表单,需要在生成以后自动跳转到“名称”的位置,然后更改,可以如下修改

  5. javascript 数组去重的6种思路

    前端在日常开发中或多或少都会碰到有对数据去重的需求,实际上,像是lodash这些工具库已经有成熟完备的实现,并且可以成熟地运用于生产环境.但是这并不妨碍我们从思维拓展的角度出发,看看去重可以用几种思路 ...

  6. Cocos2d-x游戏导出android工程,提取cocos的so文件

      Cocos2d-x游戏导出android工程,提取cocos的so文件   原本cocos游戏的android工程编译时,需要将cocos的库文件进行编译,这些文件大部分是cpp文件, 使用ndk ...

  7. WPF获取相对位置、坐标的方法

    1.获取鼠标在控件中的坐标: private void item_MouseDown(object sender, MouseButtonEventArgs e) { Point point = e. ...

  8. 蝴蝶效应--由'sudo -s ...'引发的vim autocmd使用异常

    1. 背景介绍 自加入RedHat起,我就把家里的台式机(Ubuntu 16.04 LTS)的默认登录用户veli切换成了huanli, 主要是为了跟公司的电脑配置对齐以方便未来WFH,但引发了一个v ...

  9. (译) 在AngularJS中使用的表单验证功能

    验证功能是AngularJS里面最酷炫的功能之一,它可以让你写出一个具有良好用户体验的Web应用. 在AngularJS中,有许多用于验证的指令.我们将先学习几个最流行的内置指令,然后再创建一个自定义 ...

  10. 浅谈angular2与angularJS的区别

    简介 大家好,今天给大家介绍一下angular,相信做过前端的小伙伴们都知道angular的大名,angularJS自2012年发布起就受到了大家的广泛关注.他首次提出了双向绑定概念让所有人都耳目一新 ...