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的更多相关文章

  1. SequoiaDB x Spark 新主流架构引领企业级应用

    6月,汇集当今大数据界精英的Spark Summit 2017盛大召开,Spark作为当今最炙手可热的大数据技术框架,向全世界展示了最新的技术成果.生态体系及未来发展规划. 巨杉作为业内领先的分布式数 ...

  2. [51CTO]服务器虚拟化开源技术主流架构之争

    服务器虚拟化开源技术主流架构之争 http://virtual.51cto.com/art/201812/589084.htm 大部分客户已经是KVM+OpenStack的架构了 我所见到的 工商云 ...

  3. Linux系统主流架构一

    Linux系统主流架构一 随着IT运维的不断发展,尤其的Linux的飞速发展,越来越多的企业开始使用Linux操作系统,例如:Centos.Red Hat.Ubuntu.Fadora等等,成千上亿个网 ...

  4. Linux运维主流架构简单剖析

    随着IT运维的不断发展,尤其的Linux的飞速发展,越来越多的企业开始使用Linux操作系统平台,例如CentOS.RedHat.Ubuntu.Fedora等等,成千上亿个网站涌现在当今互联网,互联网 ...

  5. Linux主流架构运维工作简单剖析

    转载:http://wgkgood.blog.51cto.com/1192594/1586259 随着IT运维的不断发展,尤其的Linux的飞速发展,越来越多的企业开始使用Linux操作系统平台,例如 ...

  6. redis集群主流架构方案分析

    Redis在互联网大数据平台有着广泛的应用,主要被用来缓存热点数据,避免海量请求压垮数据库,同时可以提升服务节点的响应速度和并发量.随着数据量的增多,由于redis是占用单台物理机或虚机的内存,内存资 ...

  7. 【转】一个Android项目搞定所有主流架构-1.项目介绍和基本MVC架构示例

    http://www.jianshu.com/p/798536fb91c5 项目启发来自谷歌的同类框架项目https://github.com/googlesamples/android-archit ...

  8. web服务的三大主流架构

    1.远程过程调用 2.服务导向架构 3.表述性状态转移 今天在自学Spring架构时貌似发现 rest的表现.与RPC方式的最大差别,SOA方式更加关注如何去连接服务而不是去特定某个实现的细节.而re ...

  9. 架构 MVC MVP MVVM 简介 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. 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 ...

  2. Android remote gdb

    On Android phone adb push ~/utils/android-ndk-r12b/prebuilt/android-arm64/gdbserver/gdbserver /data/ ...

  3. Jafka源码分析——网络架构

    在kafka中.每个broker都是一个server.依照一般理解,server就是一个SocketServer,其不断接收用户的请求并进行处理.在Java中进行网络连接有两种方式一种为堵塞模式一种为 ...

  4. vscode配置golang

    https://www.cnblogs.com/Leo_wl/p/8242628.html https://www.cnblogs.com/angelyan/p/10400789.html 主要看了这 ...

  5. MySql+EF+CodeFirst

    ef+mssql详细是许多.net程序员的标配.作为一个程序员当然不能只会mssql这一个数据库,今天简单聊聊ef+mysql.推荐新人阅读. 1]首先创建一个mvc项目,如图: 创建完毕之后再nug ...

  6. vue中使用better-scroll滚动条插件

    应用场景: overflow: hidden会让超出的部分隐藏,并且无法拖拽,所以可使用插件让长列表限定的区域滚动拖拽. 参考:https://zhuanlan.zhihu.com/p/2740702 ...

  7. 算法trick

    数组从头到尾的循环遍历: index=(index+1)%length 索引值增加定长,对长度取余,则形成头尾循环.

  8. verilog中的timescale

    `timescale是Verilog HDL 中的一种时间尺度预编译指令,它用来定义模块的仿真 时的时间单位和时间精度.格式如下: `timescale  仿真时间单位/时间精度 注意:,不能为其它的 ...

  9. GIT 开发流程

    1.git clone 使用 git clone 将一个项目下载到本地 2.git checkout -b branchName 新建一个branchName的本地分支 3.git add file/ ...

  10. Listview四种视图VIEW

    http://wenku.baidu.com/link?url=65Ac8WL6j8KZwDlN8LyoxqFF5Jynvg80LnKc4jqTPQTY-59wwRDKhqGySYwxf6gZ9_6T ...