android开发系列之MVP设计模式
最近在开发一个android的项目中,发现了一个很实用的设计模式(MVP)。大家可能一看到这个名字就有点蒙,MVP到底是什么鬼呢?它的好用到底体现在哪呢?别着急,下面就让我们一一分享出来。
说到MVP,大家也许就会想到MVC。没错,其实他们两者之间确实有很大的联系,MVC相比大家都是非常的熟悉了,典型的三层框架。但是MVC在使用的过程中有什么弊端呢?就我自己的理解是它会导致Control层和Model层衔接太紧密,因为有的时候你必须从Model里面读写数据。而MVP呢?它是在Model和View之间加了个Presenter层,所有的交互都发生在Presenter层里面。看到这里,有的人就会说了,那这不是跟MVC一样的吗?我看不出有什么区别呀?下面就让我们来看看实际代码,也许你就能领悟出一些东西了。
假如我前台有这么个Activity,代码如下:
public class MyTestActivity extends Activity implements View.OnClickListener {
private Button btnTest1,btnTest2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_test);
initView();
setClickLinear();
}
private void initView(){
btnTest1=(Button)findViewById(R.id.btnTest1);
btnTest2=(Button)findViewById(R.id.btnTest2);
}
private void setClickLinear(){
btnTest1.setOnClickListener(this);
btnTest2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btnTest1:
break;
case R.id.btnTest2:
break;
}
}
private void showButton1(){
btnTest1.setVisibility(View.VISIBLE);
}
private void hiddenButton1(){
btnTest2.setVisibility(View.GONE);
}
private void showButton2(){
btnTest2.setVisibility(View.VISIBLE);
}
private void hiddenButton2(){
btnTest2.setVisibility(View.GONE);
}
}
你可以看到在这段代码里面,我只是想要简单的实现:点击按钮1的时候隐藏按钮2,点击按钮2的时候隐藏按钮1;其实逻辑是很简单的,我们只需要分开定义好四个方法就可以了。但是如果我现在假如该activity里面还有其他需求:1.我想要页面一启动的时候就请求4张广告图片;2.中间有个gradview需要你去填充9宫格;3.需要根据用户类型显示不同的级别内容;这样一想的话,我们有可能就开始按照需要啪啪啪在Activity里面定义好相关的方法,然后再加上一个AsyncTask用于后台http请求,没错这是常用的思维逻辑。但是我们现在好好地来分析一下就会发现,Activity里面堆积的东西太多了,有没有什么办法能够给它瘦身呢?这个时候就轮到MVP闪亮登场了。请看下面的代码:
public interface ITestMVP {
void showButton1();
void showButton2();
void hiddenButton1();
void hiddenButton2();
}
首先我们定义一个接口,用于提供Activity里面所需要用到的方法协议。然后我们需要在该Activity实现这个接口,类定义如下:
public class MyTestActivity extends Activity implements View.OnClickListener,ITestMVP {
@Override
public void showButton1() {
}
@Override
public void showButton2() {
}
@Override
public void hiddenButton1() {
}
@Override
public void hiddenButton2() {
}
}
可以看到我们这个时候就应该在Activity里面重写如上四个方法,最后一步就应该将Presenter定义出来。其实Presenter的最主要的作用就是分离Activity UI层的操作和后台代码的耦合性。请看Presenter代码:
public class TestMvpPresenter {
private ITestMVP iTestMVP;
public TestMvpPresenter(ITestMVP iTestMVP) {
this.iTestMVP = iTestMVP;
}
public void Button1Click(){
iTestMVP.showButton1();
iTestMVP.hiddenButton2();
}
public void Button2Click(){
iTestMVP.showButton2();
iTestMVP.hiddenButton1();
}
}
这个时候你会发现,其实所有的相关操作我们都已经提炼到Presenter里面。这样的话,我就不仅将UI和Model分开了,同时如果有其他相关的操作,我们还可以定义其他的Adapter。从而通过Presenter粘合多个处理逻辑的功能。同时如果我们在多个页面之间是相同的处理逻辑的话,那么就以为我们可以共用同一个Presenter。是不是很简单呢?最后让我们来看看,在Activity的onCreate方法里面调用的代码:
TestMvpPresenter testMvpPresenter=new TestMvpPresenter(this);
好了,今天就到这吧!如有不对,欢迎拍砖。
android开发系列之MVP设计模式的更多相关文章
- 设计模式笔记之二:Android开发中的MVP架构(转)
写在前面,本博客来源于公众号文章:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=402435540&idx=1&sn ...
- 转:Android开发中的MVP架构(最后链接资源不错)
Android开发中的MVP架构 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目还是决定通过MVP来构建. 这篇文章是我通过研究和 ...
- 转: Android开发中的MVP架构详解(附加链接比较不错)
转: http://www.codeceo.com/article/android-mvp-artch.html 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解M ...
- Android开发中常见的设计模式 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Android开发中无处不在的设计模式——动态代理模式
继续更新设计模式系列.写这个模式的主要原因是近期看到了动态代理的代码. 先来回想一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式-- ...
- Android 开发系列教程之(一)Android基础知识
什么是Android Android一词最早是出现在法国作家维里耶德利尔·亚当1986年发表的<未来夏娃>这部科幻小说中,作者利尔·亚当将外表像人类的机器起名为Android,这就是And ...
- Android开发中常见的设计模式
对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次.而在android开发中,必要的了解一些设计模式又是非常有必要的.对于想系统的学习设计模式的 ...
- Android开发中常用的设计模式
首先需要说明的是,这篇博文灵感来自于 http://www.cnblogs.com/qianxudetianxia/archive/2011/07/29/2121547.html ,在这里,博主已经很 ...
- [Android开发系列]IT博客应用
1.关于坑 好吧,在此之前先来说一下,之前开的坑,恩,确实是坑,前面开的两个android开发教程的坑,对不起,实在是没什么动力了,不过源码都有的,大家可以参照github这个应用 https://g ...
随机推荐
- 慕课网-安卓工程师初养成-4-14 Java 循环语句之多重循环
来源:http://www.imooc.com/code/1497 循环体中包含循环语句的结构称为多重循环.三种循环语句可以自身嵌套,也可以相互嵌套,最常见的就是二重循环.在二重循环中,外层循环每执行 ...
- 同步灵无线锂电鼠G11-580HX独特“五灵键”
http://tieba.baidu.com/p/2130455709 现在鼠标功能越来越强大,游戏鼠标的宏设置,办公鼠标的复制粘贴等.各位有没有给鼠标设置一些好玩.方便.搞怪.有意思的的功能的呢?笔 ...
- java 命令行操作
打包命令 例如:将testproject下的文件打包成test.war jar cvf test.war ./testproject
- 0302 关于IT行业的就业感想
一,后感 看完了这两篇文章之后,我得到的感受是IT行业还是十分有活力的一个行业,但是在这种经济环境下和参与的就业毕业生的人数增加,直接导致了我们面对的就业形势变的十分严峻,但是作为一个商业软件专业的学 ...
- js跟随鼠标移动的写法
<script> window.onload=function(){ document.onmousemove=function (ev) { var oEvent=ev||event; ...
- 逻辑回归的分布式实现 [Logistic Regression / Machine Learning / Spark ]
1- 问题提出 2- 逻辑回归 3- 理论推导 4- Python/Spark实现 # -*- coding: utf-8 -*- from pyspark import SparkContext f ...
- Javascript中的一种深复制实现
在javascript中,所有的object变量之间的赋值都是传地址的,可能有同学会问哪些是object对象.举例子来说明可能会比较好: typeof(true) //"boolean&qu ...
- rhythmbox插件开发笔记1:简介&入门
rhythmbox是gnome下一款开源的音乐播放软件.ubuntu和fedora的桌面环境中均默认安装了rhythmbox. rhythmbox架构非常灵活,几乎所有地方都可以用插件来修改.用户想实 ...
- MySQL 5 绿色版(BAT版本) mysql50green转自http://hi.baidu.com/dburu/blog/item/e753fcc4362458aa8226accb.htmlMySQL 5 绿色版(BAT版本) By )
以前提供下载的那个 MySQL 绿色版是来自于 Web 开发工具箱之 Apache PHP MySQL 绿色套装版, 原作者是为了方便自己开发所做的一套整合了 Apache, PHP, MySQL 的 ...
- VS2008使用技巧及快捷键大全
VS2008技巧,非常实用,非常提高效率. 1,Visual Studio 2008自带的1000多个 Windows 系统使用的各种图标.光标和动画文件在Visual Studio 2008的安装目 ...