主流架构 : MVP
1 背景 MVC
平时开发APP时会发现,activity职责非常重。以MVC角度来看:
M:model数据操作层(网络请求,耗时操作,数据存取,其他逻辑操作)
V:view,指xml布局文件,其实并没有做更新UI操作
C:controller,指Activity,处理用户交互,操作model存取数据,更新UI
当activity业务繁杂时,这种模式有几点弊端:
- 所有代码都充斥在activity中,不便于后期维护
- model和view耦合度高,不利于分层
- 不方便写测试用例,测试model层数据是否正确
2 MVP
有一种解耦方法呢?有,那就是MVP模式:
M:model数据操作层(网络请求,耗时操作,数据存取,其他逻辑操作)
V:View,Activity,接受用户交互,获取数据,更新UI。不关心页面逻辑和数据操作
P:Presentor,处理用户交互,操作model存取数据,处理完成,通知View(activity)并回调数据,由View更新UI。使model和view解耦。
两者相比较:
1 MVP对于MVC的改进,把交互逻辑交给presentor去做,avtivity本身只做更新UI操作。
2 这种观点是站在APP局部代码来分析看待的,对于小型APP没有必要,会新建很多文件。大型APP和交互复杂的可以这么处理。
3 实现
每一个activity继承自对应的view,实现对应的接口,初始化presentor对象。当接受到用户交互请求,交给presentor逻辑处理,presentor持有view接口,操作model存储数据,处理成功,将返回结果回调view接口对象,这样activity就可以更新UI。目录结构:

bean : 数据实体(略)
model :数据操作层
/**
* Model 层抽象接口(数据操作)
* Created by zhangc on 2018/6/15.
*/ public interface ILoginModel { //登录
void login(String username, String password); //存入User数据
void setUser(User user); //获取User对象
User getUser(); void clear();
}
presentor:逻辑处理层
/**
* Created by zhangc on 2018/6/15.
*/ public class LoginPresentor { private IUserLoginView loginView;
private ILoginModel model; //构造方法
public LoginPresentor(IUserLoginView loginView) {
this.loginView = loginView;
model = new LoginModelImpl();
} //供View层调用
public void login(String username, String password) {
model.login(username,password);
} //供View层调用
public void clear() {
loginView.clear();
}
}
view:数据更新接口
public interface IUserLoginView {
//等待框
void showLoadingDialog();
//登录成功
void loginSuccess();
//登录失败
void loginFail();
void clear();
}
activity使用:
public class LoginActivity extends FragmentActivity implements IUserLoginView {
private EditText mEtUsername, mEtPassword;
private Button mBtnLogin, mBtnClear;
private LoginPresentor presentor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
intView();
}
private void intView() {
mEtUsername = (EditText) findViewById(R.id.et_login_name);
mEtPassword = (EditText) findViewById(R.id.et_login_pwd);
mBtnLogin = (Button) findViewById(R.id.btn_login);
mBtnClear = (Button) findViewById(R.id.btn_reset);
presentor = new LoginPresentor(this);
mBtnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
presentor.login(mEtUsername.getText().toString(), mEtPassword.getText().toString());
}
});
}
@Override
public void loginSuccess() {
//更新UI 或 跳转页面
}
}
主流架构 : MVP的更多相关文章
- SequoiaDB x Spark 新主流架构引领企业级应用
6月,汇集当今大数据界精英的Spark Summit 2017盛大召开,Spark作为当今最炙手可热的大数据技术框架,向全世界展示了最新的技术成果.生态体系及未来发展规划. 巨杉作为业内领先的分布式数 ...
- [51CTO]服务器虚拟化开源技术主流架构之争
服务器虚拟化开源技术主流架构之争 http://virtual.51cto.com/art/201812/589084.htm 大部分客户已经是KVM+OpenStack的架构了 我所见到的 工商云 ...
- Linux系统主流架构一
Linux系统主流架构一 随着IT运维的不断发展,尤其的Linux的飞速发展,越来越多的企业开始使用Linux操作系统,例如:Centos.Red Hat.Ubuntu.Fadora等等,成千上亿个网 ...
- Linux运维主流架构简单剖析
随着IT运维的不断发展,尤其的Linux的飞速发展,越来越多的企业开始使用Linux操作系统平台,例如CentOS.RedHat.Ubuntu.Fedora等等,成千上亿个网站涌现在当今互联网,互联网 ...
- Linux主流架构运维工作简单剖析
转载:http://wgkgood.blog.51cto.com/1192594/1586259 随着IT运维的不断发展,尤其的Linux的飞速发展,越来越多的企业开始使用Linux操作系统平台,例如 ...
- redis集群主流架构方案分析
Redis在互联网大数据平台有着广泛的应用,主要被用来缓存热点数据,避免海量请求压垮数据库,同时可以提升服务节点的响应速度和并发量.随着数据量的增多,由于redis是占用单台物理机或虚机的内存,内存资 ...
- 【转】一个Android项目搞定所有主流架构-1.项目介绍和基本MVC架构示例
http://www.jianshu.com/p/798536fb91c5 项目启发来自谷歌的同类框架项目https://github.com/googlesamples/android-archit ...
- web服务的三大主流架构
1.远程过程调用 2.服务导向架构 3.表述性状态转移 今天在自学Spring架构时貌似发现 rest的表现.与RPC方式的最大差别,SOA方式更加关注如何去连接服务而不是去特定某个实现的细节.而re ...
- 架构 MVC MVP MVVM 简介 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
随机推荐
- Java斗地主
package com.biggw.day14.demo05; import java.util.*; /** * @author gw * @date 2019/11/6 0006 下午 17:20 ...
- Java中实现多态的条件是什么
java中实现多态需要三个条件: 1,需要有继承关系的存在. 2,需要有方法的重写. 3,需要有父类的引用指向子类对象.
- Vue的渐进式理解(笔记)
在我看来,渐进式代表的含义是:主张最少. 每个框架都不可避免会有自己的一些特点,从而会对使用者有一定的要求,这些要求就是主张,主张有强有弱,它的强势程度会影响在业务开发中的使用方式. 比如说,Angu ...
- 3.css3中多个背景图片的用法
(background-clip裁剪,background-position位置,background-origin定位,background-repeat是否重复) <!DOCTYPE htm ...
- 前端开发HTML&css入门——CSS&选择器练习
CSS 层叠样式表 (Cascading Style Sheets)css可以用来为网页创建样式表,通过样式表可以对网页进行装饰.所谓层叠,可以将整个网页想象成是一层一层的结构,层次高的将会覆盖层次低 ...
- GROUP BY关键字优化
1.group by实质是先排序后进行分组,遵照索引建的最佳左前缀 2.当无法使用索引列,增大max_length_for_sort_data参数的设置+增大sort_buffer_size参数的设置 ...
- MySQL索引优化(索引两表优化案例)
建表SQL CREATE TABLE IF NOT EXISTS `class` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `card` INT ...
- linux Apache 的安装
rpm –qa httpd 查询是否安装了 Apache rpm –e 包名卸载安装程序 rpm –e --nodeps 包名卸载安装程序不产生依赖 #检查是否安装有依赖库 yum install – ...
- CentOS7升级gcc
CentOS7.5升级gcc到8.3.0版本 1.下载源码包 cd /usr/local/src wget http://ftp.tsukuba.wide.ad.jp/software/gcc/rel ...
- WithEvents的一些用法
WithEvents的一些用法说明:1.WithEvents是指定一个或多个已声明成员变量引用可引发事件的类的实例.2.当某个变量是使用 WithEvents 定义时,可以用声明方式指定某个方法使用 ...