学习MVP架构以及对做的MVP架构项目的一个总结

来源:互联网 发布:godaddy主域名次域名 编辑:程序博客网 时间:2024/05/17 21:44

我对MVP架构的一个小小总结

自学安卓差不多一年的时间,最近一直在网上找些源码进行学习,而发现大部分的源码都是基于MVP架构,RxJava,Retrofit。这时我才认识到自己已经很落后了,技术上跟不上大潮。在不断反复的学习后,准备找几个项目进行练习,于是乎,发现了一个特别好的MVP架构的源码,是一款新闻客户端,
非常适合刚接触MVP同学学习的项目

切入主题,首先谈谈什么是MVP

什么是MVP

MVP不同于MVC模式,它是从MVC模式衍变来的,有相同也有不同。相同的地方,Model层负责处理数据,View层负责显示,不同的地方MVP的Presenter层取代MVC的Control的位置,但都是负责处理逻辑。
1.MVP中,View层不直接与Modle层交互,它们之间的交互过程都是通过Presenter层来进行,所有的交互都通过中间人Presenter层。
2.MVC中,View会从Model层中读取数据,而不是通过Controller层。
总结:MVP将MVC中的Controller层进行了优化而生成了Presenter。Presenter层和MVC的Controller层一样,负责核心逻辑,但不一样的是Presenter通过接口协议进行数据传递,并阻断了View和Model的直接联系,从而使View和Model更加专注于自身的业务逻辑。
这里找一张网络上的图片,来说明他们之间的关系。
MVP与MVC的结构图

View

view层通常来说就是由Activity、Fragment实现的,View也会包含一个或多个Presenter的引用来满足视图的业务逻辑。View和Presenter的交互是双向的,即View层可以调用Presenter曾德逻辑方法,Presenter层也可以孔子View的显示。

Presenter

Presenter作为Model和View的桥梁,负责从Model拿到数据进行处理并返回给View。但是Presenter和其他两层的沟通是通过接口协议进行的,所以每个Presenter中通常会包含一个或多个接口协议。

Model

和MVC一样,作为数据仓库只负责对App数据进行处理。

最重要的一点,我们为什么要用MVP

我们平时在做项目的时候会发现,在Android中,业务逻辑和数据存取是紧紧耦合的,很多缺乏经验的开发者很可能会将各种各样的业务逻辑塞进某个Activity、Fragment或者自定义View中,这样会使得这些组件的单个类型臃肿不堪。如果不将具体的业务逻辑抽离出来,当UI变化时,你就需要去原来的View中抽离具体业务逻辑,这必然会很麻烦并且易出错。
当将其中复杂的业务逻辑处理移至另外的一个类(Presneter)中时,Activity or Fragment处理数据的显示以及与用户的交互,也就是MVP模式中View层的职责,其建立UI元素与Presenter的关联,同时也会处理一些简单的界面逻辑。

用MVP的好处

(1)MVP模式会解除View与Model的耦合,有效的降低View的复杂性。同时又带来了良好的可扩展性、可测试性,保证系统的整洁性和灵活性。
(2)MVP模式可以分离显示层与逻辑层,它们之间通过接口进行通信,降低耦合。理想化的MVP模式可以实现同一份逻辑代码搭配不同的显示界面,因为它们之间并不依赖与具体,而是依赖于抽象。这使得Presenter可以运用于任何实现了View逻辑接口的UI,使之具有更广泛的适用性,保证了灵活度。

好了,介绍完那么多,具体的简单练习demo我就不提供了,我只提供一个我学习的MVP的项目源码
MVP学习链接在这
以及附上我的github学习模仿此项目的链接地址

接下来就是整理一下我对项目的学习

首先是整体的包结构,因为侧边栏分为4个模块,所以分别分为四个包
这里写图片描述

此项目是将MVP结构根据功能模块单独建包
这里写图片描述
学习完之后,会充分理解MVP架构的,不信你们可以试试。
因为四个模块中除了about特别简单,是做了我的自我介绍,然后其他模块我只整理一个

这里写图片描述
我只对新闻模块整理一下。
首先主页上主要是一个toolbar,然后是一个FrameLayout
而新闻模块就是替换了这个FrameLayout的一个Fragment
在这个Fragment中主要布局就是TabLayout(指示器)和Viewpager
之后具体每个这里写图片描述
标题下的内容就是对应的Fragment

MVP对应在此包中各个的作用,
Model层负责请求网络加载数据,然后请求结果通过回调接口传递出去。
这里访问网络使用的是OkHttp的get方式
`@Override
public void loadNews(String url, final int type, final OnLoadNewsListListener listener) {
OkHttpUtils.ResultCallback loadNewsCallback = new OkHttpUtils.ResultCallback() {
@Override
public void onSuccess(String response) {
List newsBeanList = NewsJsonUtils.readJsonNewsBeans(response, getID(type));
listener.onSuccess(newsBeanList);
}

        @Override        public void onFailure(Exception e) {            listener.onFailure("load news list failure.", e);        }    };    OkHttpUtils.get(url, loadNewsCallback);}`

Presenter层主要负责处理数据,包括请求从model加载数据以及View层的展示数据。而Presenter与View层和Model的交互分别是通过构造器的注入和new出的

 public NewsDetailPresenterImpl(Context context, NewsDetailView mNewsDetailView){        this.mContent = context;        this.mNewsDetailView = mNewsDetailView;        mNewsModel = new NewsModelImpl();    }

而Presenter层数据的获取也是通过继承Model层数据的请求回调

public class NewsDetailPresenterImpl implements NewsDetailPresenter ,OnLoadNewsDetailListener

View层就是我们的Fragment.

public class NewsListFragment extends Fragment implements NewsView

只是把要实现的方法抽象到NewsView接口里,然后让Fragment去实现。从而在Presenter层里也可以调用View层的逻辑。

大体上就是这么个过程0。0 感觉我讲起来好想让你们更晕了吧,你们照着代码自己看看就会很明白的。

这个项目中一个界面用到了开源库swipeback,
这里写图片描述
这个库的作用是滑动finish掉activity.免去了点击back键的步骤。使用很简单,假如此module然后让对应Activity继承SwipeBackActivity.然后只要在AndroidManifest中的对应Activity加上属性android:theme="@style/AppTheme.NoActionBar.Translucent
即可,哦了,到此为止,这个项目我就整理到这里吧。
学习玩这个项目我对Material Design设计语言,以及新的design库里的控件都有了学习,还有学习了OkHttp也知道了如何使用。最重要的是学会了使用MVP架构

1 0
原创粉丝点击