MVP模式

原创 2016年06月01日 22:07:21

一.使用背景


 

1.逻辑业务被塞到View中(Activity),使得View变的混乱

2.MVP可以分离显示层和逻辑层,他们之间通过接口进行通信,降低耦合

3.数据层(可能是本地数据库检索数据,远程服务器,或者被替换)

4.UI层(随着产品迭代,肯定会重新设计),如果View中混合着逻辑,那么UI变化导致我们修改新的View控件,就要到原来的View中抽离具体的业务逻辑


理想状态:同一份逻辑代码搭配不同的显示界面,因为他们之间并不依赖于具体,而是依赖抽象

 

对于一个可扩展,稳定的应用来说,我们需要定义分离各个层,主要UI业务逻辑层(mvp中放到P)数据层(M)


 

二.MVP模式的三个角色

1.Presenter---交互中间人

Presenter主要作为沟通ViewModel的桥梁,他从Model层获取数据后(4返回给View层(1

使得ViewModel之间没有耦合,也将业务逻辑从View角色上抽离出来

 

2.View----用户界面

View通常指的是Activity,Fragment或者某个View控件,它含有一个一个Presenter成员变量。通常View需要实现一个逻辑接口,将View上的操作转给Presenter进行实现(2,最后Presenter调用View逻辑接口将结果返回给View元素

 

3.Model----数据存储

对于一个结构化的App来说,Model角色主要是提供数据的存取功能,Presenter需要通过Model层存储,获取数据(3,4,简单的说,Model就是封装了数据库DAO或者网络获取数据的角色,或者两者方式都有的集合



三.MVP简单实现

//接口M

public interface ArticleModel {
    public void saveArticles(List<Article> articles);
    public void loadArticlesFromCache(DataListener<List<Article>> listener);

}
//具体的M

public class ArticleModeImple implements ArticleModel {
    List<Article> mCacheArticles = new LinkedList<>();

    @Override
    public void saveArticles(List<Article> articles) {
        mCacheArticles.addAll(articles);
    }

    @Override
    public void loadArticlesFromCache(DataListener<List<Article>> listener) {
        listener.onComplete(mCacheArticles);
    }
}

//链接V跟P的接口

public interface  ArticleViewInterface {
    public void  showArticles(List<Article> articles);//展示数据
    public void showLoading();
    public void hideLoading();
}

//具体的V

public class MainActivity extends Activity implements ArticleViewInterface {
    RecyclerView mRecycleView;
    ProgressBar progressBar;
    List<Article> mArticles = new LinkedList<Article>();
    ArticleAdapter mAdapter;
    ArticlePresenter mPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        initViews();
        //初始化请求队列
        //....
        //构建ArticlePresenter,与ArticleActity建立关联
        mPresenter = new ArticlePresenter(this);
        //请求文章数据
        mPresenter.fetchArticles();
    }

    private void initViews() {
        //省略代码
        //....
    }

    @Override
    public void showArticles(List<Article> result) {
        mArticles.addAll(result);//更新数据源
        mAdapter.notifyDataSetChanged();//更新UI
    }

    @Override
    public void showLoading() {

    }

    @Override
    public void hideLoading() {

    }
}




//具体的P(一般会有一个接口P)

/**
 *Presenter作为View和Model的中间人
 * */
public class ArticlePresenter {
    //ArticleView接口,代表了View接口角色
    ArticleViewInterface mArticleView;
    //文章数据的Model,也就是Model角色
    ArticleModel mArticleModel = new ArticleModeImple();
    //从网络上获取文章的API
    ArticleAPI mAriticleApi = new ArticleAPIImpl();

    public ArticlePresenter(ArticleViewInterface mArticleView) {
        this.mArticleView = mArticleView;
    }

    //获取文章,也就是我们的业务逻辑
    public void fetchArticles(){
        mArticleView.showLoading();
        mAriticleApi.fetchArticles(new DataListener<List<Article>>(){
            @Override
            public void onComplete(List<Article> result) {
                //数据加载完,调用View的showArticles函数将数据传递给View显示
                mArticleView.showArticles(result);
                mArticleView.hideLoading();
                //存储到数据库
                mArticleModel.saveArticles(result);
            }
        });
    }

    public void loadArticlesFromDB(){
        mArticleModel.loadArticlesFromCache(new DataListener<List<Article>>() {
            @Override
            public void onComplete(List<Article> result) {
                //从数据库加载
                mArticleView.showArticles(result);
            }
        });
    }

}


通过这个用例可以看到,Presenter对于View是完全解耦的,

1.Presenter依赖的是ArticleViewInterface抽象,而不是具体的MainActivity这个类,因此当UI界面变化,只要新UI实现AriticleViewInterface以及相关的逻辑就可以跟Presenter用起来

2.Presenter将业务逻辑从MainActivity抽离出来,让MainActivity变得非常轻量级,MainActivity只要做一些View的初始化

3.MVP中的ViewModel不能直接通信,他们交互通过PresenterArticlePresenter中持有

ArticleViewInterface(抽象),还持有ArticleModel(抽象),这两个的具体实现可以轻易被替换

Android中MVP模式讲解及实践

前两年的时候,我经常逛http://androidweekly.net这个网站,上面就有过很多文章介绍MVP模式,我很感兴趣,于是把这个东西介绍给身边的同事,同事们好像没有多大反应,可能是当时在国内M...
  • briblue
  • briblue
  • 2016年10月17日 15:44
  • 4240

MVP模式在Android开发中的应用

一、MVP介绍      随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责。为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时...
  • fwy19930618
  • fwy19930618
  • 2014年04月29日 15:48
  • 89943

android中MVP模式(一)

1. 明确需求,界面如下:可存,可根据id读取数据。
  • knxw0001
  • knxw0001
  • 2014年09月28日 09:41
  • 142201

MVP模式原理分析 以及两个实例带你飞

这里介绍mvp模式的特点与优点,为了方便理解 举了用mvp模式实现的两个例子,例一偏向简单用于原理说明,例二应用现在比较火的Retrofit和RXJava进行网络数据请求的mvp模式实例。...
  • j18874964028sss
  • j18874964028sss
  • 2017年04月27日 19:52
  • 451

java-mvp模式简单实现

Presenter负责逻辑的处理,Model提供数据,View负责显示。 在MVP中View并不直接使用Model,它们之间的通信是通过Presenter(MVC中的Controller)来进行的,所...
  • linsawako
  • linsawako
  • 2016年11月15日 23:01
  • 2492

浅谈安卓中的MVP模式

该篇博客主要对MVP模式进行了解析,有 MVP简介,为什么使用MVP模式,MVP模式实例,MVP中的内存泄露问题几部分组成...
  • u012124438
  • u012124438
  • 2016年06月10日 14:21
  • 8168

MVP模式从入门到精通

首先附上本人自己写的一个MVP的demo,这是一个很标准的MVP,Github地址如下: https://github.com/SilasGao/MVPDemo...
  • qq_31852701
  • qq_31852701
  • 2016年10月27日 15:24
  • 12469

Android设计模式之浅谈MVP

一.概述 MVP(Model-View-Presenter) 是总所周知MVC模式的一个演变,他们的主要目的都是划分模块职责,降低模块耦合,易测试,提高代码复用,这里主要针对Android平台来简单分...
  • l2show
  • l2show
  • 2015年06月27日 11:58
  • 37378

浅谈安卓MVP模式

对于MVP(Model View Presenter),大多数人都能说出一二:“MVC的演化版本”,“让Model和View完全解耦”等等。本篇博文通过对google官方demo:https://gi...
  • dfskhgalshgkajghljgh
  • dfskhgalshgkajghljgh
  • 2016年05月04日 20:42
  • 4551

MVP模式&简单实例

网上关于什么是MVP模式的文章,一搜一大堆。这里也不班门弄斧了。MVP要素在MVP模式里通常包含4个要素: (1)View:负责绘制UI元素、与用户进行交互(在Android中体现为Act...
  • DeMonliuhui
  • DeMonliuhui
  • 2017年03月13日 17:28
  • 702
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MVP模式
举报原因:
原因补充:

(最多只允许输入30个字)