MVC & MVP & MVVM

本文深入探讨了MVC、MVP和MVVM三种设计模式的区别与联系,详细解析了每种模式的组成元素及其在软件开发中的角色。从传统MVC到现代MVC,再到MVP的两种形式PassiveView和SupervisingController,以及MVVM的双向数据绑定特性,文章提供了清晰的对比和实例说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看了很多相关资料,越看越迷糊,感觉很多资料都没有说清楚,在此对自己理解的内容加以总结,并在最后附上本人认为解释得比较清楚的参考

##MVC

网上解释的版本太多,有说是单向流动,有的说M与V是完全分离的,有的说不是,图也有各种版本,其实都是MVC,只是衍生的各种变种

###传统MVC

MVC模式发展版本太多,很多资料上写的都有所不同,在此,先甩出传统MVC,传统MVC的图也有很多版本啊,但可以确定的是Model和View是有联系的,View会在Model上注册为监听者,当Model发生改变时会通知View进行更新,即观察者模式,在Cocoa官方文档中给出示意图如下(我认为比较清楚的):

Traditional MVC

  • Model, 数据 + 业务逻辑
  • View, 数据表现,即UI
  • Controller, 负责用户输入,将用户命令转化成消息传递给Model或View

###现代MVC

现代MVC是在传统MVC进化的,很多人理解的MVC是Model和View没有联系,Model的改变不再通知View更新,而是通知Controller,让Controller去负责View的更新,即Model和View之间双向传递数据的中间协调者。

例如Cocoa版本的进化MVC,将Model层和View隔离开来,分别与Controller对接,Contoller充当两者的中间人,下图为官方示意图:

Cocoa MVC

虽然说是Model与View隔离开来,但是在实际开发中,Model与View并非全无关系,很多情况下,View是知道Model的类型,通过向View抛出Model来更新View。

有一点很多资料没有提及到的是:MVC是由组合(Composite),策略(Strategy)和观察者(Observer)模式构成的一种复合模式(Compound Pattern),以下是苹果官方的解释,而Cocoa MVC则多了中介者(Mediator)和 命令(Command)模式

In the original (Smalltalk) conception, MVC is made up of the Composite, Strategy, and Observer patterns.

Composite—The view objects in an application are actually a composite of nested views that work together in a coordinated fashion (that is, the view hierarchy). These display components range from a window to compound views, such as a table view, to individual views, such as buttons. User input and display can take place at any level of the composite structure.

Strategy—A controller object implements the strategy for one or more view objects. The view object confines itself to maintaining its visual aspects, and it delegates to the controller all decisions about the application-specific meaning of the interface behavior.

Observer—A model object keeps interested objects in an application—usually view objects—advised of changes in its state.

##MVP

MVP模式有两种,分别是Passive View 和 Supervising Controller,网上大多数讨论的都是Passive View

Passive View(被动视图)MVP

Passive View的MVP

对于Passive View的MVP,Model与View完全隔离,所有消息通过Presenter传递,View没有数据绑定,而是暴露出Presenter用来设置数据的setter属性,Presenter持有Model和View,View持有一个对应的Presenter,而Model则独立性最高,不持有View,也不持有Presenter。

  • Model, 数据
  • View, UI,逻辑几乎为0,将用户命令路由到Presenter
  • Presenter, Model与View的中间人,包含业务逻辑

Supervising Controller(监视控制器)MVP

Supervising Controller的MVP

对于Supervising Controller的MVP,View和Model是可以直接绑定的,同时Presenter仍然控制对View上操作的响应,并能改变View,其实就是Presenter和View对逻辑代码分担的程度不同。

###MVC与MVP区别

Stackoverflow上的有个图我觉得挺形象的,Controller是大管家,Presenter是私人秘书

MVC

MVP

MVVM

与Passive View MVP相似,只是Presenter替换成ViewModel,最大的不同是View与ViewModel之间的双向数据绑定(Two-way data-binding)。下图来自Wiki百科。
MVVM

  • Model, 数据+业务逻辑
  • View, UI
  • ViewModel, Model与View的桥梁,负责界面逻辑与模型数据封装,包含数据绑定(data binding)

##总结

无论是MVC,MVP,还是MVVM,都是对模块的拆分及组合,C/P/VM都是M与V的粘合剂,区别在于如何处理Model与View的关系。

下表是三种模式的对比图(在此MVP指Passive View MVP)

MVCMVPMVVM
特点传统MVC,Model变化会通知View,现代MVC将两者隔离Model与View完全隔离,View逻辑几乎为0,基本所有业务逻辑放在PresenterView与ViewModel的双向数据绑定
View&ModelModel对View不了解, ,大多数情况下View会持有Model完全隔离完全隔离
View&C/P/VMController持有一个或多个View,View不知道Controller通常一个Presenter映射一个View,View持有一个对应Presenter一个ViewModel可被一个或多个View持有,但ViewModel不知道View
Model&C/P/VMController持有Model,Model不知道ControllerPresenter持有Model,但Model不需要保存对Presenter的引用ViewModel持有Model,Model不知道Controller

参考:

1.在谈MVP之前,你真的懂MVC吗?

2.iOS 框架模式(简述 MVC,MVP,MVVM 和 VIPER)

3.Cocoa Design Patterns

4.what-are-mvp-and-mvc-and-what-is-the-difference

5.MVVM Compared To MVC and MVP

6.Wiki百科Model–view–viewmodel

7.【框架篇】mvc、mvp、mvvm使用关系总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值