文档章节

MVP模型

t_yapeng
 t_yapeng
发布于 2017/04/26 18:03
字数 631
阅读 69
收藏 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模型。可在此基础上进行扩充,删改。

© 著作权归作者所有

共有 人打赏支持
上一篇: Android 动画
下一篇: Synchronized 相关bug
t_yapeng
粉丝 4
博文 105
码字总数 30194
作品 0
Android工程师
私信 提问
Android MVP模式开发

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

SRain215
2016/04/06
138
0
Android MVP 最佳实践

作者 Tamic MVC 起源和发展! MVP其实我接触已经三年了,本文的实践也是在17年实践的,今天放出来也是为了分享给需要这快东西的同学,面试足够了,好东西不能雪藏。 1 起源 MVC:全称:Model...

Tamic
11/09
0
0
死磕安卓前序:MVP架构探究之旅—基础篇

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

codeGoogle
06/08
0
0
MVP模式基本概念

mvp的全称为Model-View-Presenter,Model提供数据,View负责显示,Controller/Presenter负责逻辑的处理。MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过P...

壮壮521
2015/06/17
1
0
红薯大哥聚会提到的 MVA

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

Allen_My
2011/06/27
741
4

没有更多内容

加载失败,请刷新页面

加载更多

java框架学习日志-2

上篇文章(java框架学习日志-1)虽然跟着写了例子,也理解为什么这么写,但是有个疑问,为什么叫控制反转?控制的是什么?反转又是什么? 控制其实就是控制对象的创建。 反转与正转对应,正转...

白话
13分钟前
0
0
Integer使用双等号比较会发生什么

话不多说,根据以下程序运行,打印的结果为什么不同? Integer a = 100;Integer b = 100;System.out.println(a == b);//print : trueInteger a = 200;Integer b = 200;System.out.pr...

兜兜毛毛
昨天
7
0
CockroachDB

百度云上的CockroachDB 云数据库 帮助文档 > 产品文档 > CockroachDB 云数据库 > 产品描述 开源NewSQL – CockroachDB在百度内部的应用与实践 嘉宾演讲视频及PPT回顾:http://suo.im/5bnORh ...

miaojiangmin
昨天
4
0
I2C EEPROM驱动实例分析

上篇分析了Linux Kernel中的I2C驱动框架,本篇举一个具体的I2C设备驱动(eeprom)来对I2C设备驱动有个实际的认识。 s3c24xx系列集成了一个基于I2C的eeprom设备at24cxx系列。at24cxx系列芯片包...

yepanl
昨天
5
0
设计模式之工厂模式

本篇博文主要翻译这篇文章: https://www.journaldev.com/1392/factory-design-pattern-in-java 由于翻译水平有限,自认为许多地方翻译不恰当,欢迎各位给出宝贵的建议,建议大家去阅读原文。...

firepation
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部