文档章节

MVP模型

t_yapeng
 t_yapeng
发布于 2017/04/26 18:03
字数 631
阅读 68
收藏 0
点赞 0
评论 0

MVP是模型(Model)、视图(View)、主持人(Presenter)的缩写,分别代表项目中3个不同的模块。

  • 模型(Model):负责处理数据的加载或者存储,比如从网络或本地数据库获取数据等;

  • 视图(View):负责界面数据的展示,与用户进行交互;

  • 主持人(Presenter):相当于协调者,是模型与视图之间的桥梁,将模型与视图分离开来。

如下图所示,View与Model并不直接交互,而是使用Presenter作为View与Model之间的桥梁。其中Presenter中同时持 有Viwe层以及Model层的Interface的引用,而View层持有Presenter层Interface的引用。当View层某个界面需要展 示某些数据的时候,首先会调用Presenter层的某个接口,然后Presenter层会调用Model层请求数据,当Model层数据加载成功之后会 调用Presenter层的回调方法通知Presenter层数据加载完毕,最后Presenter层再调用View层的接口将加载后的数据展示给用户。 这就是MVP模式的整个核心过程。

这样分层的好处就是大大减少了Model与View层之间的耦合度。一方面可以使得View层和Model层单独开发与测试,互不依赖。另一方面 Model层可以封装复用,可以极大的减少代码量。

View层

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/decorView"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <TextView
        android:id="@+id/tv"
        android:layout_width="100dp"
        android:layout_height="50dp" />
</FrameLayout>
public interface ViewClusters {
    /**
     * 处理数据
     *
     * @param newsList
     */
    void dealWithData(List<String> newsList);

    /**
     * 出错处理
     */
    void error();
}
public class MainActivity extends Activity implements ViewClusters {

    private TextView tv;
    private PresenterClusters presenterClusters;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv);
        presenterClusters = new PresenterClustersImpl(this);
        presenterClusters.loadData("//TODO URL");
    }

    @Override
    public void dealWithData(List<String> newsList) {
        // TODO do something
        tv.setText(newsList.toString());
    }

    @Override
    public void error() {
        // TODO deal error
        tv.setText("error");
    }
}

presenter层

public interface PresenterClusters {
    /**
     * 加载数据
     * @param url
     */
    void loadData(String url);
}
public class PresenterClustersImpl implements PresenterClusters, OnLoadNewsListListener {

    private ViewClusters viewClusters;
    private ModelClusters modelClusters;

    public PresenterClustersImpl(ViewClusters viewClusters) {
        this.viewClusters = viewClusters;
        this.modelClusters = new ModelClustersImpl();
    }

    @Override
    public void loadData(String url) {
        modelClusters.loadNews(url, this);
    }

    @Override
    public void onSuccess(List<String> list) {
        viewClusters.dealWithData(list);
    }

    @Override
    public void onFailure(String msg, Exception e) {
        viewClusters.error();
    }
}

Model层

public interface OnLoadNewsListListener {

    /**
     * 数据加载成功
     *
     * @param list
     */
    void onSuccess(List<String> list);

    /**
     * 数据加载失败
     *
     * @param msg
     * @param e
     */
    void onFailure(String msg, Exception e);
}
public interface ModelClusters {
    /**
     * 加载数据
     *
     * @param url
     * @param l
     */
    void loadNews(String url, OnLoadNewsListListener l);
}
public class ModelClustersImpl implements ModelClusters {

    @Override
    public void loadNews(String url, OnLoadNewsListListener l) {
        // TODO 加载数据
        if (true) {
            l.onSuccess(new ArrayList<String>());
        } else {
            l.onFailure("", new Exception());
        }
    }
}

这只是一个简单的MVP模型。可在此基础上进行扩充,删改。

© 著作权归作者所有

共有 人打赏支持
t_yapeng
粉丝 3
博文 101
码字总数 29446
作品 0
Android工程师
Android MVP模式开发

一.什么是MVP MVP是模型(Model)、视图(View)、主持人(Presenter)的缩写,分别代表项目中3个不同的模块。  模型(Model):负责处理数据的加载或者存储,比如从网络或本地数据库获取数...

SRain215 ⋅ 2016/04/06 ⋅ 0

死磕安卓前序:MVP架构探究之旅—基础篇

前言 了解相关更多技术,可参考《我就死磕安卓了,怎么了?》,接下来谈一谈我们来学习一下MVP的基本认识。 大家对MVC的架构模式再熟悉不过。今天我们就学习一下MVP架构模式。 MVC和MVP之间的...

codeGoogle ⋅ 06/08 ⋅ 0

Android -------- MVC,MVP 和 MVVM 架构设计模式

MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用。它本身很容易理解,但是要讲清楚,它与衍生的 MVP 和 MVVM 架构的区别就不容易了。 一、MVC MVC模式的意思是,软件...

切切歆语 ⋅ 03/28 ⋅ 0

红薯大哥聚会提到的 MVA

OSChina 首次聚会上 红薯大哥 提到了他开发 OSChina的 模式 当时有人提到是 MVP模式。 小弟不是很懂,就查找了下。 特将查找的资料分享下: (还有一英文文档上传 : mvp模式.pdf) MVC模式 &&...

Allen_My ⋅ 2011/06/27 ⋅ 4

MVP?MVC?移动开发如何选择正确的框架?

  【IT168 评论】设计模式和架构对创建一个成功可靠的应用程序至关重要,可是具备哪些特征才算得上一个好的架构呢?MVP、MVC和MVVM似乎都不错,该如何选择呢?   为什么以及如何选择正确的...

it168网站 ⋅ 2017/06/26 ⋅ 0

MVP模式与MVC模式(转)

MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中...

cywaker ⋅ 2015/07/10 ⋅ 0

JavaScript 的 MVP 框架--Riot.js

Riot.js是一个客户端模型-视图-呈现(MVP)框架并且它非常轻量级甚至小于1kb.尽管他的大小令人难以置信,所有它能构建的有如下:一个模板引擎,路由,甚至是库和一个严格的并具有组织的MVP模式...

红薯 ⋅ 2013/11/05 ⋅ 6

Riot V3.1.0 发布,JavaScript 的 MVP 框架

Riot v3.1.0 发布了,Riot.js 是一个客户端模型-视图-呈现(MVP)框架并且它非常轻量级甚至小于1kb.尽管他的大小令人难以置信,所有它能构建的有如下:一个模板引擎,路由,甚至是库和一个严格...

凝小紫 ⋅ 2017/01/30 ⋅ 2

Riot v3.0.0-alpha.3 发布,JavaScript 的 MVP 框架

Riot vv3.0.0-alpha.3 发布了,Riot.js是一个客户端模型-视图-呈现(MVP)框架并且它非常轻量级甚至小于1kb.尽管他的大小令人难以置信,所有它能构建的有如下:一个模板引擎,路由,甚至是库和...

oschina ⋅ 2016/05/13 ⋅ 1

MVP模式在Android项目中的使用

以前在写项目的时候,没有过多考虑架构模式的问题,因为之前一直做J2EE开发,而J2EE都是采用MVC模式进行开发的,所以在搭建公司项目的时候,也是使用类似MVC的架构(严格来讲,之前的项目还算...

丁佳辉 ⋅ 2016/05/26 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

UI ,前端框架选型

Flat-UI

miaojiangmin ⋅ 3分钟前 ⋅ 0

Istio Service Mesh 教程

Istio Service Mesh 教程 作者 宋净超 | 5400字 | 阅读大约需要11分钟 | 归档于istio | 发表于 2018-05-22 标签 #Istio #教程,来自 https://servicemesher.github.io/blog/istio-service-m...

openthings ⋅ 8分钟前 ⋅ 0

scala swing

scala swing组件的库 https://github.com/scala/scala-swing scala swing的API文档 https://www.scala-lang.org/api/2.9.1/scala/swing/package.html...

whoisliang ⋅ 12分钟前 ⋅ 0

CentOS安装配置Nginx

安装依赖 yum install gcc yum install pcre-devel yum install zlib zlib-devel yum install openssl openssl-devel //一键安装上面四个依赖 yum -y install gcc zlib zlib-devel pcre-deve......

临江仙卜算子 ⋅ 19分钟前 ⋅ 0

开源 java CMS - FreeCMS2.8 依申请公开

项目地址:http://www.freeteam.cn/ 依申请公开 1. 转交申请公开 用户可以把申请公开转交给其他人办理,系统会记录此申请公开的转交记录。 注意:同时只能转交一个申请公开。 选择需要转交的...

freeteam ⋅ 23分钟前 ⋅ 0

以太坊 web3.py 签名转账

以太坊 web3.py 签名转账 本文节选自电子书《Netkiller Blockchain 手札》 Netkiller Blockchain 手札 Mr. Neo Chan, 陈景峯(BG7NYT) 中国广东省深圳市龙华新区民治街道溪山美地 518131 +86...

netkiller- ⋅ 29分钟前 ⋅ 0

年薪40W的程序员必会的技术有哪些?

很多人在问我,程序员如何拿高薪,如何做到年薪40W+,其实总结出来还是一句话,你的技术决定你的能力已经薪资。 那么什么样的技术人才才能拿到一份Java行业里面的高薪呢? 下面是我的一个总结...

码代码的小司机 ⋅ 29分钟前 ⋅ 0

jesque-spring使用及源码分析

1.使用 jesque结合spring使用,步骤如下: 1.1 在项目中添加maven依赖 <dependency> <groupId>net.lariverosc</groupId> <artifactId>jesque-spring</artifactId> <version>1.0.0</ve......

Funcy1122 ⋅ 31分钟前 ⋅ 0

OSChina 周二乱弹 —— 加班的代码不要枉费了我的童子功

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《29》- 未完成乐队 《29》- 未完成乐队 手机党少年们想听歌,请使劲儿戳(这里) @FalconChen :#看球提醒# 02:00 巴西v...

小小编辑 ⋅ 57分钟前 ⋅ 16

Docker Swarm的前世今生

概述 在我的《Docker Swarm集群初探》一文中,我们实际体验了Docker Swarm容器集群技术的魅力,与《Kubernetes实践录》一文中提到的Kubernetes集群技术相比,Docker Swarm没有Kubernetes显得...

CodeSheep ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部