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

2019-03-08  本文已影响0人  大猿媛

什么是MVC

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

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

最正确的关系

MVC三层之间的关系

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

MVC存在什么问题

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


view和Controller
view和model

什么是MVP

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

MVP
MVP使用案例,伪代码
//新闻listView,1 进入时的数据加载动画,2 数据加载完成后展示,隐藏加载动画,3 数据加载失败(网络原因等)要给用户反馈
Class NewsView(){
   func showLoadingView();
   func showNewsList(newsList[]);
   func hideLoadingView();
   func refreshLikeStatus(isLike);
   func refreshCollectStatus(isCollect);
   ......
}
// 新闻Model,1 定义新闻字段,2 缓存新闻数据,3 读取新闻缓存数据
Class NewsModel(){
   String  newsID;
   String  newsTitle;
   String  newsIcon;
   String  newsUrl;
   String  newsTime;
   func  cacheNewsList(newsList[newsModel]); // 缓存
   func  readCacheNews( ) -> Array;  //读取缓存
}
//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);  //收藏
}
//新闻列表控制器,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之间的关系同理。

上一篇 下一篇

猜你喜欢

热点阅读