主流架构 : 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 ...
随机推荐
- 题解 CF1140D 【Minimum Triangulation】
题意:求将一个n边形分解成(n-2)个三边形花费的最小精力,其中花费的精力是所有三角形的三顶点编号乘积的和(其中编号是按照顶点的顺时针顺序编写的) 考虑1,x,y连了一个三角形,x,y,z连了一个三角 ...
- Python 入门之 推导式
Python 入门之 推导式 推导式就是构建比较有规律的列表,生成器,字典等一种简便的方式 1.推导式 (1)列表推导式 : <1> 普通循环: [变量 for循环] print([i f ...
- 针对Vue相同路由不同参数的刷新问题
在使用vue和vue-router开发spa应用时,我们会遇到这样一种问题.当页面跳转时,组件本身并没有发生改变: // 路由映射关系'/form/:type' // 当前页面路由/form/shop ...
- 破解mysql
https://blog.csdn.net/lian_easel/article/details/78734240 破解mysql
- Chrome开发者工具详解(二)之使用断点调试代码下
JS调试技巧 技巧一:格式化压缩代码 技巧二:快速跳转到某个断点的位置 右侧的Breakpoints会汇总你在JS文件所有打过的断点,点击跟checkbox同一行的会暂时取消这个断点,若是点击chec ...
- 46. Permutations (JAVA)
Given a collection of distinct integers, return all possible permutations. Example: Input: [1,2,3] O ...
- IOS绘图详解(http://blog.163.com/wkyuyang_001/blog/static/10802122820133190545227/)
14.1 Quartz概述 Quartz是Mac OS X的Darwin核心之上的绘图层,有时候也认为是CoreGraphics.共有两种部分组成Quartz: Quartz Compositor,合 ...
- Codeforces 940 区间DP单调队列优化
A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...
- 瞎JB逆
P为质 ; long long quickpow(long long a, long long b) { ) ; ; a %= mod; while(b) { ) ret = (ret * a) % ...
- socket keepalive 服务端异常断线
异常断线 客户端检测不到 没有重连