Android设计模式-MVP模式

一、什么是MVP模式

MVP(Model / View / Presenter)  是从经典的模式MVC演变而来,Presenter代替activity和fragment成为控制器,而activity和fragment专心做View层该做的事。

二、MVP的优点

1、模型和视图分离开了,层次更清晰了。

2、Presenter可以重复利用了。

3、如果我们把逻辑放在Presenter中,单元测试更简单了

三、实战

下边是我项目的结构图

MVP中parsenter处理完逻辑后通过接口通知View层,我把这些接口都放在aisle包中。下面看一下接口和数据模型中的代码

public interface ICard {
    void onStartLoading();//开始加载

    void onLoading();//加载中

    void onLoadingDone(Card card);//加载成功

}
public class Card {
    public Card(String name, String tel) {
        this.name = name;
        this.tel = tel;
    }

    public String name;
    public String tel;

    public String getName() {
        return name;
    }

    public String getTel() {
        return tel;
    }

    public String toString() {
        return "  name:" + name + "  tel:" + tel;
    }
}

很普通的接口和数据模型,接口用来通知View刷新UI。下面是parsenter中的代码

public class CardParsenter {
    private String TAG = "CardParsenter";
    private ICard iCard;

    public CardParsenter(ICard iCard) {
        this.iCard = iCard;
    }

    public void getCard() {
        iCard.onLoadingDone(new Card("小明", "12345678"));
    }

    public void setCard(Card card) {
        Log.i(TAG, card.toString());
    }

}

parsenter持有一个View层的接口用于实现回传通知,下面是View层代码

public class UserActivity extends AppCompatActivity implements ICard {

    public CardParsenter cardParsenter;
    public EditText nameET, telET;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        cardParsenter = new CardParsenter(this);
        nameET = (EditText) findViewById(R.id.nameET);
        telET = (EditText) findViewById(R.id.telET);
    }

    public void click(View view) {
        switch (view.getId()) {
            case R.id.setBT:
                cardParsenter.setCard(new Card(nameET.getText().toString(), telET.getText().toString()));
                break;
            case R.id.getBT:
                cardParsenter.getCard();
                break;
        }
    }

    @Override
    public void onStartLoading() {

    }

    @Override
    public void onLoading() {

    }

    @Override
    public void onLoadingDone(Card card) {
        nameET.setText(card.getName());
        telET.setText(card.getTel());
    }
}

View实现ICard接口,并传给parsenter,通道建立完毕。最后是布局代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".view.UserActivity"
    tools:showIn="@layout/activity_main">

    <EditText
        android:id="@+id/nameET"
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:hint="nameET"
        android:textSize="20sp" />

    <EditText
        android:id="@+id/telET"
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/nameET"
        android:hint="tel"
        android:textSize="20sp" />

    <Button
        android:id="@+id/setBT"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/telET"
        android:onClick="click"
        android:text="set"
        android:textSize="20sp" />

    <Button
        android:id="@+id/getBT"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/telET"
        android:layout_toEndOf="@+id/setBT"
        android:onClick="click"
        android:text="get"
        android:textSize="20sp" />

</RelativeLayout>

四、总结

MVC有个缺点就是View层和model层耦合在一起,造成了Activity做控制的同时也做View层的事(比如设置监听,设置动画、初始化控件等...)。MVP在MVC的基础上分离了View层和model层,然后用parsenter控制模型,得到结果后通知View刷新UI,从而避免耦合。

代码地址:http://download.csdn.net/detail/s4336723/9515111

一个MVP模式的框架:https://github.com/sockeqwe/mosby

时间: 2024-08-27 11:50:03

Android设计模式-MVP模式的相关文章

ym——Android开发MVP模式(解决了View和Model的耦合)

什么是MVP呢?它又和我们常常听到的MVC有什么关系了以及区别呢? MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示.作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不

Android设计模式—策略模式

1.策略模式概念 定义一系列算法,把他们独立封装起来,并且这些算法之间可以相互替换.策略模式主要是管理一堆有共性的算法,客户端可以根据需要,很快切换这些算法,并且保持可扩展性. 策略模式的本质:分离算法,选择实现. 2.策略模式实现 下面针对策略模式说一个小型的实现例子,个人觉得学习设计模式,最好的方法是看看设计模式概念,然后先看看简单的模式实现的例子.策略模式实现起来,主要需要3部分:抽象接口.实现算法.上下文. //算法的接口 public interface PriceStrategy {

Android开发MVP模式实践

现在用一个基于MVP模式的APP项目进一步分析MVP的实际应用. 原项目应该使用的是Android studio开发,笔者对项目进行了整理,广大Eclipser请猛点Github链接. 一.项目功能说明 APP获取好友列表后将数据展示在一个ListView中,点击Item会打开一个新页面展示好友详细信息. 二.项目结构 示例将代码分为四层,对应到MVP模式中: Mode:Entities Presenter:Use Cases+Presenters View:UI 为了保证每个层都能方便的进行单

Android -- 初探MVP模式

1,相信大家对mvp模式都很熟悉了,M-Model-模型.V-View-视图.C-Controller-控制器.MVP作为MVC的版本演化,与MVC的意义类似:M-Model-模型.V-View-视图.P-Presenter-表示器.从MVC和MVP两者结合来看,Controlller/Presenter在MVC/MVP中都起着逻辑控制处理的角色,起着控制各业务流程的作用.而 MVP与MVC最不同的一点是M与V是不直接关联的也是就Model与View不存在直接关系,这两者之间间隔着的是Prese

Android设计模式——MVP

一.什么是MVP MVP:全称 Model-View-Presenter. MVP框架由3部分组成:View层负责显示,Presenter层负责逻辑处理,Model层提供数据. View:负责绘制UI元素.与用户进行交互(在Android中体现为Activity,Fragment) Model:负责存储.检索.操纵数据 Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑. 二.创建Model Presenter View三个包 三.代码编写 1.View层代码

android开发-mvp模式理解

看之前,先忘掉所有,一步步看就行了. 最后会有一个原型demo,当然是转的了.看完文章,再看demo,然后再回头看文章就很好理解了,最好自己写一遍. 1.mvp开发模式可以理解为页面接口编程,每一层的骨架都是先通过建立接口,定义每层的必要方法,再实现方法完成的. 2.在mvp开发模式中,把每个模块代码分为三个层,View,presenter,model层. 3.view层从字面意义上理解,就是视图层,在安卓的mvp开发模式中,把activity,fragment,等 一些界面显示看作是视图层,在

Android架构篇--MVP模式的介绍篇

摘要: 在MVVM成熟之前MVP模式在Android上有被神化的趋势,笔者曾经在商业项目中从零开始大规模采用过MVP模式对项目进行开发.在使用MVP模式进行开发的时候发现项目的结构模式对开发是有一定的影响的,在这里笔者会对这一问题进行探讨.希望通过这篇blog能让读者了解如何使用MVP模式搭建一个功能完善的MVP模式开发框架,避免一些笔者认为比较严重的问题. 为什么要使用MVP模式 在传统的Android开发中,我们一般是使用MVC模式进行开发的.传统MVC模式介绍: View: 视图层,对应x

[转]MVP模式开发

转自:http://www.jianshu.com/p/f7ff18ac1c31 基于面向协议MVP模式下的软件设计-(iOS篇) 字数9196 阅读505 评论3 喜欢11 基于面向协议MVP模式下的软件设计-(iOS篇) 传统模式下的开发 MVC MVVM 基于面向协议MVP的介绍 MVP实战开发 说在前面:相信就算你是个iOS新手也应该听说过MVC的,MVC是构建iOS App的标准模板.随着时间的推移,在iOS平台上MVC也逐渐开始面临着越来越多的问题,最近又开始流行MVVM,MVVM使

android MVP模式简单介绍

原文 http://zhengxiaopeng.com/2015/02/06/Android%E4%B8%AD%E7%9A%84MVP/ 前言 MVP作为一种MVC的演化版本在Android开发中受到了越来越多的关注,但在项目开发中选择一种这样的软件设计模式需保持慎重心态,一旦确定 使用MVP作为你App的开发模式那么你就最好坚持做下去,如果在使用MVP模式开发过程中发现问题而且坑越来越大,这时你想用MVC等来重新设计的话基 本上就等于推倒重来了.要知道在Android上MVP在现在为止并没有统