zoukankan      html  css  js  c++  java
  • android学习笔记(1)--MVP设计模式

    近期由于要做android大作业,需要做一个app出来。先从阅读开源的app开始,这次选择的app是MovieGuide(https://github.com/esoxjem/MovieGuide),在这个应用中用到了很多目前android开发比较实用的技术,诸如:MVP pattern, RxJava, Dagger 2 and Uncle Bob Martin's Clean Architecture approach等等,也是老师上课不会涉及到的东西,谨尊建腿教导,用博客记录学习过程中心中点点滴滴,这次先看看MVP设计模式。

    首先需要看看MVC的架构:

    • 其中View层其实就是程序的UI界面,用于向用户展示数据以及接收用户的输入

    • 而Model层就是JavaBean实体类,用于保存实例数据

    • Controller控制器用于更新UI界面和数据实例

    进入正题:

    MVP是MVC在android中的变种,在android中Activity不仅承担了View的角色,还承担了一部分的Controller角色,V和C就耦合在一起,有必要在Activity中,把View和Controller抽离开来,而这就是MVP模式的工作目的。 

    MVP的核心思想:MVP把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成Presenter接口,Model类还是原来的Model

    UML图(重要):

    上面一张简单的MVP模式的UML图,从图中可以看出,使用MVP,至少需要经历以下步骤:

    1. 创建IPresenter接口,业务逻辑的接口,实现类PresenterCompl(在这里可以方便地查看业务功能,由于接口可以有多种实现所以也方便写单元测试)

    2. 创建IView接口,视图逻辑的接口,实现类是当前的Activity/Fragment

    3. Activity里包含了一个IPresenter,而PresenterCompl里又包含了一个IView并且依赖了Model。Activity里只保留对IPresenter的调用,其它工作全部留到PresenterCompl中实现

    4. Model并不是必须有的,但是一定会有View和Presenter

    5. 通过IVIew和IPresenter,把Activity的UI LogicBusiness Logic分离开来,Activity just does its basic job! 至于Model嘛,还是原来MVC里的Model。

    通过上面的介绍,MVP的主要特点就是把Activity里的许多逻辑都抽离到View和Presenter接口中去。

    eg.一个项目中用MVP的目录结构可以是如下的模式:

    更多体会需要到实际项目中感受,以上就是记录一些没什么乱用的理论知识。

    下面看看在MovieGuide中是如何用用MVP设计模式的,

    首先看detail目录中:

    其中MovieDetailsActivity是承载MovieDetailsFragment的容器,然后在MovieDetailFragment中有MVP的设计模式,这其中调用了IMovieDetailsPresenter这个接口的一个实例:

    @Inject
        IMovieDetailsPresenter movieDetailsPresenter;

    然后他本身也是IMovieDetailsView的一个实现:

    public class MovieDetailsFragment extends Fragment implements IMovieDetailsView, View.OnClickListener

    很明显可以看出,在这个Fragment中,我们就找到了MVP设计模式的痕迹,在下面的listing包中也都可以找到类似的结构:

    这就是MVP在MovieGuide这个app中的实际应用,算是搞懂了一丢丢,感谢https://segmentfault.com/a/1190000003927200博文中的理论知识,讲的比我清楚多了。

  • 相关阅读:
    进程间通信的方式——信号、管道、消息队列、共享内存
    exit()与_exit()的区别(转)
    [Google Codejam] Round 1A 2016
    使用shell脚本自定义实现选择登录ssh
    PHP的反射机制【转载】
    PHP set_error_handler()函数的使用【转载】
    PHP错误异常处理详解【转载】
    php的memcache和memcached扩展区别【转载】
    .htaccess重写URL讲解
    PHP数据库扩展mysqli的函数试题
  • 原文地址:https://www.cnblogs.com/summerxt/p/6064789.html
Copyright © 2011-2022 走看看