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 ...
随机推荐
- 断言--NSAssert
NSAssert()是一个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来断定是否属于Bug,满足条件返回真值,程序继续运行,如果返回假值,则抛出异常,并切可以自定义异常 ...
- UVa11324 最大团 The Largest Clique-有向图强连通分量&DP
https://vjudge.net/problem/UVA-11324 给定一张有向图G,求一个节点数目最大的节点集,使得该集合中的任意两个节点u和v满足:要么u可以到达v,要么v可以到达u(u,v ...
- No.001 Two Sum
Two Sum Total Accepted: 262258 Total Submissions: 1048169 Difficulty: Easy Given an array of integer ...
- windows异常调用顺序
(一) 发生异常时系统的处理顺序(by Jeremy Gordon, Hume): 1.系统首先判断异常是否应发送给目标程序的异常处理例程,如果决定应该发送,并且目标程序正在被调试,则系统 挂 ...
- AX 的 NumberSequences
EG: 在库存模块新加一个numberSequences. 1. 新加一个EDT\ SML_Test1; 2. 在库存模块的 class\NumberSeqReference_Inventory\Lo ...
- iOS开发中view controller设置问题
- iOS取证将如漫漫长夜
日前因恐攻一案,FBI对一支已上锁的iPhone 5c束手无策,美国法院出具命令要求苹果配合,但被苹果公司执行长库克以维护安全及隐私为由悍然拒绝. 平心而论,各有其立场,但在一个犯罪案件之中,真的可以 ...
- 智能手机取证利器再进化-UFED Cloud Analyzer
智能手机在现代人生活中,和钱包,钥匙一样,成了不可或缺的生活必需品,举凡食衣住行育乐都需要携带随身使用,因此,智能手机里所存放的,就是一个人的生活缩影,只是人们多半不自知智能手机竟是如此贴心的为你/妳 ...
- _func_
__func__标识符 引用:http://blog.csdn.net/zhoujunyi/article/details/1572325 __func__是C99标准里面预定义标识符, 它是一个st ...
- IPHONE 字体加粗
UIFONT 没有字体加精参数,但可以修发,字体名,达到加粗的效果正常:Helvetica加粗"Helvetica-Bold""TimesNewRomanPS-BoldM ...