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 ...
随机推荐
- 缓存之Redis
Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorte ...
- 【PL/SQL练习】基本的PL/SQL语句
1.无变量匿名快 begin dbms_output.put_line('Hello World'); end; 2.有变量的匿名块,定义变量: declare v_ename ); v_sal ,) ...
- .NET程序与CA对接一直提示重定向
最可能问题:应用程序服务器与CA服务器时间不同步 解决方法: 打开时间,选择internet时间,操作如图,在.net程序服务器 输入CA服务器的IP ,或者CA服务器输入 .net程序部署服务器的I ...
- android大项目运行中出现问题汇总
Android 项目中,特别是当项目文件和规模达到一定的程度后,会引发一些平常不常见的问题. 下面对遇到的一些问题做一个汇总和总结. scenario 1: 在项目中,我们采用了chromimum内核 ...
- WP8_区分滑动和点击(在图片列表中)
在windows phone中,对于一个页面中 有图片列表的,滑动的时候,很容易被误认为是点击了图片,而打开图片详细信息等,原意是滑动列表,由此对图片添加2个事件,来控制其点击行为(滑动的时候,基本不 ...
- libpcap报文解析: ipv4、ipv6 @ 2014.7.2
#include <string.h> #include <stdlib.h> #include <pcap.h> #include <stdio.h> ...
- ntfs安全权限和共享权限的区别
win xp 最大分区32G,最大文件大小4G. 共享权限是为网络用户设置的,NTFS权限是对文件夹设置的. 用户对文件夹有什么权限就是看NTFS权限的设置. 如果一个文件夹设置成共享,其具体的权限还 ...
- MYSQL数据导入导出
在不同操作系统或MySQL版本情况下,直接拷贝文件的方法可能会有不兼容的情况发生.所以一般推荐用SQL脚本形式导入.下面分别介绍两种方法. 进入cmd 导出所有数据库:输入:mysqldump -u ...
- Oracle登录时提示错误,导致用户无法登录
Oracle登录时提示错误,导致用户无法登录,错误如下 ------------------------------------------------------------------------ ...
- 返回json格式时间,解析时间
传入:Json格式的时间 JS如下: yyyy-M(MM)-d(dd) H(HH):m(mm):s(ss) function timeStamp2String(time) { var data=tim ...