MVP架构
一、介绍
MVP(Model View Presenter)架构是从著名的MVC(Model View Controller)架构演变而来的。对于在Android应用中开发就可以视为是MVC架构,布局文件视为View,Activity视为Controller,但是Activity还要控制布局的更新,所以说Activity是Controller与View的合体,这样的结果是Actiivty的代码很多也很杂乱,而MVP就是将Activity充当的Controller与View的角色分割开来。
View:对于View层也是视图层,在View层中只负责对数据的展示,提供友好的界面与用户进行交互。在Android开发中通常将Activity或者Fragment作为View层。
Model:对于Model层也是数据层。它区别于MVC中的Model,在这里不仅仅只是数据模型。在MVP架构中Model它负责对数据的存取操作,例如对数据的读取,网络的数据请求等。
Presenter:对于Presenter层也是连接View层与Model层的桥梁并对业务逻辑进行处理。在MVP架构中Model与View无法直接进行交互。所以在Presenter层它会从Model层获得所需要的数据,进行一些适当的处理后交由View层进行显示,这样通过Presenter将View与Model进行隔离,使得View和Model之间不存在耦合,同事也将业务逻辑从View中抽离。
在MVP架构中将这三层分别抽象到各自的接口当中。通过接口将层次之间进行隔离,而Presenter对View和Model的相互依赖也是依赖于各自的接口。这点符合了接口隔离原则,也正是面向接口编程。在Presenter层中包含了一个View接口,并且依赖于Model接口,从而将Model层与View层联系在一起。而对于View层会持有一个Presnter成员变量并且只保留对Presenter接口的调用,具体业务逻辑全部交由Presnter接口实现类中处理。
二、好处
1.View与Model并不直接进行交互,而是通过Presenter连接彼此。View中不存在Model,从而也不会存在业务逻辑。
2.Presenter与View的交互式通过接口来实现的,耦合度低,也有利于单元测试。
3.Presenter是基于行为的,一个Presnter可用于多个View,增强了代码复用。
三、使用
使用MVP架构来实现一个ListView的显示。
1.定义一个Mode接口
public interface IMode {
List<String> getDatas();
}
2.定义一个IView接口
public interface IView {
void showProgress();
void hideProgress();
void showText(String text);
void showDatas(List<String> datas);
void showToast(String message);
}
3.定义一个Presenter接口
public interface IPresenter {
void getDataList();
void onItemClick(int position);
}
4.定义MainMode类实现IMode接口
public class MainMode implements IMode {
@Override
public List<String> getDatas() {
List<String> datas = new ArrayList<>();
//return datas;
datas.add("A");
datas.add("B");
datas.add("C");
datas.add("D");
datas.add("E");
datas.add("F");
return datas;
//return null;
}
}
5.定义MainPresenter类实现IPresenter接口
public class MainPresenter implements IPresenter {
private IView mView;
private IMode mMode;
public MainPresenter(IView mView) {
this.mView = mView;
mMode = new MainMode();
}
@Override
public void getDataList() {
mView.showProgress();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
List<String> datas = mMode.getDatas();
mView.hideProgress();
if (datas == null) {//获取数据失败
mView.showText("请求数据失败!");
} else {//获取数据成功
if (datas.size() == 0) { //数据为空
mView.showText("数据为空!");
} else {
mView.showDatas(datas);
}
}
}
}, 2000);
}
@Override
public void onItemClick(int position) {
mView.showToast(String.format("Position %d clicked", position + 1));
}
}
6.定义MainActivity类实现IView接口
public class MainActivity extends AppCompatActivity implements IView, AdapterView.OnItemClickListener {
private ListView mListView;
private ProgressBar mProgressBar;
private TextView mTextView;
private IPresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.list);
mProgressBar = (ProgressBar) findViewById(R.id.progress);
mTextView = (TextView) findViewById(R.id.text);
mPresenter = new MainPresenter(this);
mPresenter.getDataList();
}
@Override
public void showProgress() {
mProgressBar.setVisibility(View.VISIBLE);
mListView.setVisibility(View.GONE);
}
@Override
public void hideProgress() {
mProgressBar.setVisibility(View.GONE);
mListView.setVisibility(View.VISIBLE);
}
@Override
public void showText(String text) {
mProgressBar.setVisibility(View.GONE);
mListView.setVisibility(View.GONE);
mTextView.setVisibility(View.VISIBLE);
mTextView.setText(text);
}
@Override
public void showDatas(List<String> datas) {
mListView.setAdapter(new ArrayAdapter<>(this, R.layout.simple_list_item, datas));
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mPresenter.onItemClick(position);
}
@Override
public void showToast(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
}
代码地址:https://github.com/ZhangMiao147/FrameworkDemo
参考文章:
http://www.lai18.com/content/7010875.html
http://www.lai18.com/content/2453405.html
http://www.lai18.com/content/475341.html
http://www.lai18.com/content/24630178.html
http://www.lai18.com/content/719388.html
http://www.lai18.com/content/7017296.html
MVP架构的更多相关文章
- MVP架构。。。。
Model-View-Presenter(MVP)概述 MVC模式已经出现了几十年了,在GUI领域已经得到了广泛的应用,由于微软ASP.NET MVC Framework的出现,致使MVC一度成 ...
- 转:Android官方MVP架构示例项目解析
转自: http://www.infoq.com/cn/articles/android-official-mvp-architecture-sample-project-analysis 作者 吕英 ...
- 转:Android开发中的MVP架构(最后链接资源不错)
Android开发中的MVP架构 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目还是决定通过MVP来构建. 这篇文章是我通过研究和 ...
- 转: Android开发中的MVP架构详解(附加链接比较不错)
转: http://www.codeceo.com/article/android-mvp-artch.html 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解M ...
- Android MVP架构分析
App架构在Android开发者中一直是讨论比较多的一个话题,目前讨论较多的有MVP.MVVM.Clean这三种.google官方对于架构的态度一直是非常开放的,让开发者自主选择组织和架构app的方式 ...
- 设计模式笔记之二:Android开发中的MVP架构(转)
写在前面,本博客来源于公众号文章:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=402435540&idx=1&sn ...
- mvp架构解析
MVP现在已经是目前最火的架构,很多的框架都是以MVP为基础,甚至于Google自己都出一个MVP的开源架构.https://github.com/googlesamples/android-arch ...
- 用户登录(Material Design + Data-Binding + MVP架构模式)实现
转载请注明出处: http://www.cnblogs.com/cnwutianhao/p/6772759.html MVP架构模式 大家都不陌生,Google 也给出过相应的参考 Sample, 但 ...
- MVP架构在xamarin android中的简单使用
好几个月没写文章了,使用xamarin android也快接近两年,还有一个月职业生涯就到两个年了,从刚出来啥也不会了,到现在回头看这个项目,真jb操蛋(真辛苦了实施的人了,无数次吐槽怎么这么丑),怪 ...
随机推荐
- eclipse简介及下载
一.Eclipse 是非常着名的跨平台的自由集成开发环境(IDE).最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++和Python的开发工具. 二.Eclipse的 ...
- 用ng-view创建单页APP
我们假设我们有一个单页面的程序,并且想为这个页面添加动画效果.点击某一个链接会将一个试图滑出,同时将另一个试图滑入. 我们将会使用: 使用 ngRoute 来为我们的页面路由 使用 ngAnimate ...
- ural 1297. Palindrome
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1297 求最长回文子串 典型的后缀数组的入门题目,但是可以用更简单的方法解决,毕竟数据量比 ...
- 从C++ int类型的变量范围谈起
从学习C语言开始,int类型所占字节数,以及数值范围就是一个挥之不去的问题.一开始会死记硬背一个char 1个字节,一个字节8个bit.64位机器上面一个int 4个字节,32位机器上面不一样.那时候 ...
- 浅谈RSA加密
RSA背景 在1976年以前,传统的加解密过程是: 1.A采用某种手段对数据进行加密. 2.数据传输到B的手中. 3.B逆向的实施A加密采用的步骤. 4.数据被还原. 这就是所谓的对称加密. 解密和加 ...
- vuex使用报错
1.vuex简介 最近在玩vuex,不得不说它是一个很强大的工具,它的目的就是把数据统一管理起来,方便各个组件之间来回调用 2.vuex引用报错 当我们去官网看API文档的时候,会发现官网是这么应用a ...
- SYRefresh 一款简洁易用的刷新控件 支持tableview,collectionview水平垂直刷新功能
SYRefresh 地址: https://github.com/shushaoyong/SYRefresh 一款简洁易用的刷新控件 示例程序: 默认刷新控件使用方法: //添加头部刷新控件 Sc ...
- StringTokenizer使用笔记
StringTokenizer 基本使用 笔者最近在做算数表达式的逆波兰式转换和解析,原始表达式为String类型,在使用StringTokenizer 之前笔者的解决思路是 将原始表达式->转 ...
- Natas Wargame Level 3 Writeup 与 robots.txt
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnsAAAC5CAYAAABQi/kBAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF
- 3.Java 加解密技术系列之 SHA
Java 加解密技术系列之 SHA 序 背景 正文 SHA-1 与 MD5 的比较 代码实现 结束语 序 上一篇文章中介绍了基本的单向加密算法 — — MD5,也大致的说了说它实现的原理.这篇文章继续 ...