MVC
MVC模式想做的,是把界面(UI)和逻辑(Logic)进行分离。
其中 Controller 和 View 处理界面,Model 则负责逻辑。
随着多年的发展,MVC模式有了很多变化,统称为MVC-like。
本文中涉及的svg图片,均可在:https://github.com/aspirantzhang/blog/tree/main/mvc-model2-mvp-mvvm 下载并使用draw.io进行编辑。
经典MVC
在经典MVC模式中,View是系统的核心,由View发起动作,Controller作为动作的执行者,负责根据预定逻辑更新Model,至于Model更新后做了什么,Controller不参与。而Model一旦更新,通过观察者模式,View可以监测到变化,并且根据Model的变化更新视图。
经典MVC模式主要为桌面应用程序设计,不太适合Web应用。
适用于Web应用的MVC模式:Model 2
Model2最初为JSP设计,与后来的ASP.NET MVC类似。
在Model2模式中,Controller是系统的核心,用户所有请求被 Controller 拦截(Front Controller模式,servlet / filter)。Controller 从 Model 获取需要的数据,并整合成 View 层需要的 Domain Objects(一般包含数据和业务逻辑,POJO / JavaBean)。随后,Controller 根据结果调用适当的 View 进行展示。
此模式下,View 和 Model 的部分可能有多种实现。一般倾向于单向互通(即View可直接获取Model)或间接互通。
MVP
MVP 模式下,View 与 Model 完全不互通,强化 Controller (即 Presenter) 的指挥权利,Model 只可被 Presenter 调用。
Presenter 和 View 完全通过某种协议(接口)来通信,使 Presenter 和 View 在功能上也能保持相对独立。
MVVM
与MVP相比,其中 Model 无明显变化,View 与 Presenter 的通信接口由双向数据绑定系统(data binding system)代替。
Presenter 被替换为 ViewModel,突出它对视图的控制权利,负责处理视图的state和logic。
该模式中,View保持瘦小,ViewModel 非常大。View 与 Model 依然无任何联系。
部分参考资料:
Presentation Patterns : MVC, MVP, PM, MVVM
https://docs.microsoft.com/en-us/xamarin/xamarin-forms/enterprise-application-patterns/mvvm
MVVM in Delphi: Architecting and Building Model View ViewModel Applications – by John Kouraklis