美文网首页
三种框架的比较—教你认清MVC,MVP和MVVM

三种框架的比较—教你认清MVC,MVP和MVVM

作者: 大猿媛 | 来源:发表于2019-03-08 22:19 被阅读0次

    什么是MVC

    MVC,Model View Controller,是软件架构中最常见的一种框架,实际就是把业务逻辑、数据、界面显示的代码分开组织,各层专注于各自的功能,易于扩展、管理等

    在具体开发过程中,MVC就是通过controller的控制去操作model层的数据,并且返回给view层展示,如图

    最正确的关系

    MVC三层之间的关系

    Apple是这样说的,在MVC下,所有的对象被归类为一个model,一个view,或一个controller。Model持有数据,View显示与用户交互的界面,而controller调解model和view之间的交互。

    • View层
      继承自系统视图基类封装的所有自定义View
    • Model层
      针对业务模型,建立的数据结构和相关的类,它主要负责网络请求,数据库处理,I/O的操作。
    • Controller层
      安卓的activity,iOS的UIViewController层,用来初始化界面,网络请求展示数据,还要处理view层的交互事件,具体的业务逻辑等

    MVC存在什么问题

    MVC经典的被用了那么多年,有问题吗?当越来越复杂的业务逻辑需要处理,无数个model view controller,我们需要三者之间进行通信,回调,事件传递,我们发现MVC是有问题的,或者说实现绝对的MVC很难


    view和Controller
    view和model
    • 1、经典存在问题是大部分写MVC的结构都是这样的,model管理数据,Controller中引用model当作属性,Controller中引用view当作属性,view中Import model当作预留属性(这句便是耦合,将M和V建立起了关系),使用时是这样的,Controller来调度View和Model(承载view将Model数据进行展示,Controller中的网络请求来更新Model,同时通过View的Setter方法更新view),这样可以说是V被M给耦合了。这便是经典MVC存在的弊端,但是为什么还有好多人去这么写?是因为快!操作快,这就是伪MVC的经典好处也是存在的耦合弊端。

    • 2、controller的负担随着业务的复杂度持续增高,数据请求,初始化视图,处理业务逻辑,臃肿的controller导致代码不易维护,也增加了测试的复杂度

    什么是MVP

    MVP作为MVC的演化,解决了MVC不少的缺点,MVP的model层和MVC是一样的,而view和controller都属于view层,所有关于用户事件的转发全部交由presenter层处理。下面还是让我们看图

    MVP
    • 1、View就是MVC的view和controller,在MVP中只负责view层,如controller只负责初始化视图,view展示
    • 2、presenter层替代了原来controller层的网络请求,业务逻辑等所有关于用户事件的转发处理
    • 3、Controller会持有Presenter,同时持有View,通过presenter获取到model层数据,那View层怎么和presenter通信呢,需要View层定义API,比如刷新资讯推荐列表,刷新banner数据,Persenter在获取到model之后,调用View层的API进行数据展示
    • 4、如此一来,Preseter实现了Model和View的完全解耦。代码可复用性高了,维护成本低了,实现了测试驱动开发(调用presenter的方法就能测试,不依赖视图)
    • 5、问题:1. 随着业务逻辑的增加,一个页面可能会非常复杂,UI的改变是非常多,会有非常多的case,这样就会造成View的接口会很庞大。
    MVP使用案例,伪代码
    • View 层
    //新闻listView,1 进入时的数据加载动画,2 数据加载完成后展示,隐藏加载动画,3 数据加载失败(网络原因等)要给用户反馈
    Class NewsView(){
       func showLoadingView();
       func showNewsList(newsList[]);
       func hideLoadingView();
       func refreshLikeStatus(isLike);
       func refreshCollectStatus(isCollect);
       ......
    }
    
    • Model 层
    // 新闻Model,1 定义新闻字段,2 缓存新闻数据,3 读取新闻缓存数据
    Class NewsModel(){
       String  newsID;
       String  newsTitle;
       String  newsIcon;
       String  newsUrl;
       String  newsTime;
       func  cacheNewsList(newsList[newsModel]); // 缓存
       func  readCacheNews( ) -> Array;  //读取缓存
    }
    
    • Presenter 层
    //Presenter,1 请求新闻数据,  2 调用NewsModel缓存新闻数据,  3 调用View层接口刷新UI   4 处理用户事件
    Class Presenter(){
       private  newsV: NewsView;  
       private  newsM: NewsModel;
       func requestNewsData(url,param);
       func likeNews(newsModel); //点赞
       func shareNews(newsModel);  //分享
       func collectNews(newsModel);  //收藏
    }
    
    • Controller 层
    //新闻列表控制器,1 初始化视图进行展示   2 初始化presenter进行网络请求  
    Class NewsController(){
       private newsView: NewsView;
       private newsPresenter:Presenter
       func  createView();
       func  layoutView();
    }
    
    MVP

    MVVM和数据绑定(DataBinding 和 RAC)

    MVVM+数据绑定解决了MVP中View层可能会API过多的问题

    实际项目中需要事件传递,不同对象间通信,也就是一方的变化需要传达给另一方,传统的实现方式有通知、代理、观察者模式等等,但是这些方法代码分散,不易维护和管理,所以数量不宜过多;数据绑定机制(单向绑定和双向绑定)就解决了这一问题,iOS中有RAC,安卓有DataBinding,前端有VUE

    在MVVM中,由于ViewController持有ViewModel,而ViewModel不能反向持有ViewController,所以,当ViewModel中发生变化时,需要通知ViewController,所以需要将ViewModel中的一些内容与ViewController绑定起来,这称为单向绑定;有时ViewController和viewModel中任何一端发生变化,对方都能知道,这称为双向绑定。ViewModel与Model之间的关系同理。

    相关文章

      网友评论

          本文标题:三种框架的比较—教你认清MVC,MVP和MVVM

          本文链接:https://www.haomeiwen.com/subject/zaudpqtx.html