主流架构 : 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 ...
随机推荐
- so easy(并查集+unordered_map)
There are nn points in an array with index from 11 to nn, and there are two operations to those poin ...
- Android remote gdb
On Android phone adb push ~/utils/android-ndk-r12b/prebuilt/android-arm64/gdbserver/gdbserver /data/ ...
- Jafka源码分析——网络架构
在kafka中.每个broker都是一个server.依照一般理解,server就是一个SocketServer,其不断接收用户的请求并进行处理.在Java中进行网络连接有两种方式一种为堵塞模式一种为 ...
- vscode配置golang
https://www.cnblogs.com/Leo_wl/p/8242628.html https://www.cnblogs.com/angelyan/p/10400789.html 主要看了这 ...
- MySql+EF+CodeFirst
ef+mssql详细是许多.net程序员的标配.作为一个程序员当然不能只会mssql这一个数据库,今天简单聊聊ef+mysql.推荐新人阅读. 1]首先创建一个mvc项目,如图: 创建完毕之后再nug ...
- vue中使用better-scroll滚动条插件
应用场景: overflow: hidden会让超出的部分隐藏,并且无法拖拽,所以可使用插件让长列表限定的区域滚动拖拽. 参考:https://zhuanlan.zhihu.com/p/2740702 ...
- 算法trick
数组从头到尾的循环遍历: index=(index+1)%length 索引值增加定长,对长度取余,则形成头尾循环.
- verilog中的timescale
`timescale是Verilog HDL 中的一种时间尺度预编译指令,它用来定义模块的仿真 时的时间单位和时间精度.格式如下: `timescale 仿真时间单位/时间精度 注意:,不能为其它的 ...
- GIT 开发流程
1.git clone 使用 git clone 将一个项目下载到本地 2.git checkout -b branchName 新建一个branchName的本地分支 3.git add file/ ...
- Listview四种视图VIEW
http://wenku.baidu.com/link?url=65Ac8WL6j8KZwDlN8LyoxqFF5Jynvg80LnKc4jqTPQTY-59wwRDKhqGySYwxf6gZ9_6T ...