Android 设计模式之 浅谈MVP

一.概述

MVP(Model-View-Presenter) 是总所周知MVC模式的一个演变,他们的主要目的都是划分模块职责,降低模块耦合,易测试,提高代码复用,这里主要针对Android平台来简单分析MVP.

1.层级责任

Model:       负责数据的检索,持久化等操作

View:         负责UI的绘制和用户的交互

Presenter: 作为Model和View的中间协调部分,负责两者之间的业务逻辑处理

2.与MVC模式的区别

MVP模式与MVC模式从层级数据流向上来说一个主要的区别应该就是:MVC模式允许View层和Model层直接通讯.从图1和图2可以看到MVP和MVC的区别.

图1MVC模式中Model可以直接update data 到View层。所以当某个View的功能很复杂的时候,View和Model的耦合度可能会很高(并且在android的开发中Activity通常会充当controller&view的角色,结果Activity就很臃肿).而MVP模式就没有这个问题,View会抽象出来一系列操作UI的接口(Model层也可以),Presenter拿到的都是其他两个层级的接口来做业务逻辑的处理.这样不仅可以使View和Model之间的耦合度降低,还可以更易得进行单元测试.

图1:MVC模式

图2:MVP模式

3.MVP的优缺点

优点:降低耦合,层级职责更明显,易于单元测试

缺点:造成类数量爆炸,代码复杂度和学习成本高,在某些场景下presenter的复用会产生接口冗余

二. MVP简单的实例

使用MVP 写一个简单的登陆功能,主页就两个按钮:Login 和 Clear

1.项目结构

2.Model层

包含有一个实体UserBean用来承载数据和UserBiz来对登陆数据判断

public class UserBean {
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

UserBiz通过抽象出一个接口

public interface UserBiz {
    public void login(UserBean login);
}

UserBizImpl实例化接口,并且通过登陆监听将结果回调给Presenter

public class UsrBizImpl implements UserBiz{
    private OnLoginListener listener;

    public UsrBizImpl(OnLoginListener listener){
        this.listener = listener;
    }

    @Override
    public void login(UserBean login) {
        boolean status = false;
        String username,password;
        username = login.getUsername();
        password = login.getPassword();
        if (username != null && "asdf".equals(username))
            if (password != null && "123".equals(password))
                status = true;
        listener.loginStatus(status);
    }
}

3.View层

把View层针对控件操作抽象出来一些列的接口

public interface LoginView {
    public String getUsername();
    public String getPassword();
    public void clearUsername();
    public void clearPassword();
    public void showMsg(String msg);
}

在Activity里面实现该接口的控件操作,并且初始化Presenter,这是可以看到Activity里面没有逻辑处理,只是对UI的控件进行数据或者行为的操作,所有的动作都是有Presenter的接口来实现,这样在项目里面会极大得精简Activity的体积.

public class LoginActivity extends Activity implements LoginView{
    private EditText username, password;
    private Button login, clear;
    private LoginPresenter loginPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        init();
    }

    private void init(){
        loginPresenter = new LoginPresenterImpl(this);
        username = (EditText) findViewById(R.id.username);
        password = (EditText) findViewById(R.id.pass);
        login = (Button) findViewById(R.id.login);
        clear = (Button) findViewById(R.id.clear);
        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                loginPresenter.login();
            }
        });

        clear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                loginPresenter.clear();
            }
        });
    }

    @Override
    public String getUsername() {
        return username.getText().toString();
    }

    @Override
    public String getPassword() {
        return password.getText().toString();
    }

    @Override
    public void clearUsername() {
        username.setText("");
    }

    @Override
    public void clearPassword() {
        password.setText("");
    }

    @Override
    public void showMsg(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
    }
}

4.Presenter层

在Presenter层里面,Presenter掌握着View和Model的所有接口,Presenter就可以根据不同的业务逻辑通过MV两层的接口来实现特定的功能,让M和V独立出来.

public class LoginPresenterImpl implements LoginPresenter, OnLoginListener{
    private UserBiz userBiz;
    private LoginView loginView;

    public LoginPresenterImpl(LoginView loginView){
        this.loginView = loginView;
        userBiz = new UsrBizImpl(this);
    }

    @Override
    public void login() {
        UserBean login = new UserBean();
        login.setUsername(loginView.getUsername());
        login.setPassword(loginView.getPassword());
        userBiz.login(login);
    }

    @Override
    public void clear() {
        loginView.clearPassword();
        loginView.clearUsername();
    }

    @Override
    public void loginStatus(boolean status) {
        String msg;
        if (status)
            msg = "login succeed";
        else
            msg = "login failed";
        loginView.showMsg(msg);
    }
}

5.Demo下载地址

CSDN下载

三.总结

简单得用了下MVP,也有跟朋友讨论了一下,好多人都说这个看着挺不错的,但是用着很麻烦。确实现在Android项目用MVP的不是占多数,带着一些疑惑楼主就想去了解一下android原生程序里面是用的什么风格的,之前也有看过一些android源码,但是都是断断续续的,也好久没有写过博客了,本着对技术的热爱,计划重新开启撸android源码的计划(从Android原生的系统程序到framework再一路向下),现在希望自己能够坚持下来,并且产出一个博客的系列和大家一起分享和成长.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 15:49:06

Android 设计模式之 浅谈MVP的相关文章

Android开发:浅谈MVP模式应用与内存泄漏

最近博主开始在项目中实践MVP模式,却意外发现内存泄漏比较严重,但却很少人谈到这个问题,促使了本文的发布,本文假设读者已了解MVP架构. 本文原创作者:xiong_it,链接:http://blog.csdn.net/xiong_it MVP简介 M-Modle,数据,逻辑操作层,数据获取,数据持久化保存.比如网络操作,数据库操作 V-View,界面展示层,Android中的具体体现为Activity,Fragment P-Presenter,中介者,连接Modle,View层,同时持有modl

浅谈 MVP in Android(转)

我自己写的demo:https://pan.baidu.com/s/1dFImVYD 一.概述 对于MVP(Model View Presenter),大多数人都能说出一二:“MVC的演化版本”,“让Model和View完全解耦”等等.本篇博文仅是为了做下记录,提出一些自己的看法,和帮助大家如何针对一个Activity页面去编写针对MVP风格的代码. 对于MVP,我的内心有一个问题: 为何这个模式出来后,就能被广大的Android的程序员接受呢? 问了些程序员,他们对于MVP的普遍的认识是:“代

设计模式——个人浅谈

设计模式--个人浅谈 1.什么是设计模式 开篇先借用名人Christopher Alexander说过的一句话"每一个模式描述了一个在我们周围不断重复出现发生的问题,以及该问题的解决方案的核心.这样,你就能一次又一次地使用该方案而不必做重复劳动". 这是GOF里对设计模式的一个形容.显而易见,设计模式是一个根据不断出现的常见问题而归纳出的一个通用的解决方案,有了它,可避免做重复性的工作.但是它又不一定是解决整个问题的全部,但肯定是解决问题的核心.解决方法架构. 一开始的时候,可能会被&

【大话设计模式】——浅谈设计模式基础

初学设计模式给我最大的感受是:人类真是伟大啊!单单是设计模式的基础课程就让我感受到了强烈的生活气息. 个人感觉<大话设计模式>这本书写的真好.让貌似非常晦涩难懂的设计模式变的生活化.趣味化. 以下浅谈一下对设计模式基础的理解,假设理解的不好.还请大家指正. 首先设计模式是对面向对象的更专业的诠释.面向对象的三大基本特征是继承.封装.多态. 继承: 1.子类继承父类非private的属性和功能. 个人理解:有几个老婆是私有属性,小明他爸有好几个老婆.小明呢.恰好赶上了国家颁布法律一夫一妻 制(怎

浅谈MVP实现Android应用层开发

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 背景 之所以要谈这个话题是因为你在开发App时可能会发现,Activity担负的责任非常之重,如果站在MVC框架角度看自己开发的App,一般xml布局文件科Activity的setContentView等充当了View角色,Activity其他代码充当了Controller角色,其他数据来源

[Android&amp;amp;Java]浅谈设计模式-代码篇:观察者模式Observer

观察者,就如同一个人,对非常多东西都感兴趣,就好像音乐.电子产品.Game.股票等,这些东西的变化都能引起爱好者们的注意并时刻关注他们.在代码中.我们也有这种一种方式来设计一些好玩的思想来.今天就写个Demo来描写叙述一下这种思想,用java内置的Observer来实现这一思想. 好,程序猿是不善言语的,看代码先. 1.demo的结构: 2.先创建我们的主题类Subject,他就是我们本demo的明星类.继承了Observable,顾名思义,就是被观察的类 .其它观察者对他但是虎视眈眈哦(事实上

浅谈 MVP in Android

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/46596109: 本文出自:[张鸿洋的博客] 一.概述 对于MVP(Model View Presenter),大多数人都能说出一二:"MVC的演化版本","让Model和View完全解耦"等等.本篇博文仅是为了做下记录,提出一些自己的看法,和帮助大家如何针对一个Activity页面去编写针对MVP风格的代码. 对于MVP,我的内心有一个问题: 为

浅谈MVP架构及开发模式

Model-View-Presenter(MVP)概述    MVC模式已经出现了几十年了,在GUI领域已经得到了广泛的应用,由于微软ASP.NET MVC Framework的出现,致使MVC一度成为.NET社区的热名话题.作为MVC的变种MVP模式,也已经出现好几年了,在微软模式与实践小组提供的Web Client Software Factory中,给出了实现MVP模式的应用程序最佳实践,本文将试着对这两种实现比较一二.MVC(Model-View-Controller,模型-视图-控制器

Android事件总线 浅谈 EventBus

EventBus官方文档是这么写的:EventBus is a publish/subscribe event bus optimized for Android. 也就是说EventBus是Android下高效的发布/订阅事件总线机制. EventBus可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程之间传递数据,执行方法. 我们先来看看官方文档对EventBus的介绍: simplifies the commu