Lang MVC系统设计模式
- MVC: Model-View-Controller
- MVA: Model-View-Adapter
- MVP: Model-View-Presenter
- MVVM: Model-View-ViewModel
使用MVC系列设计模式, 使用在用户界面开发上. 可以把视图, 模型与控制分离开, 实现松
耦合设备, 方便重用, 测试与维护
-
Model: 模式的中心组成部分. 它是应用程序的动态数据结构, 独立于用户界面.
它直接管理应用程序的数据, 逻辑和规则.
-
View: 信息的任何表示形式,例如图表,图表或表格。可以使用同一信息的多种视图
,例如用于管理的条形图和用于会计的表格视图。
-
Controller: 接受输入并将其转换为模型或视图的命令.
交互:
- Model负责管理应用程序的数据。它从控制器接收用户输入
- View表示以特定格式表示模型, 需要注册Model的监听
- Controller响应用户输入并在Model对象上执行交互。控制器接收输入,
可选地对其进行验证,然后将输入传递给Model
优点:
- Simultaneous development – 多个开发人员可以同时处理模型,控制器和视图
- High cohesion – MVC可以将控制器上相关动作的逻辑分组在一起。特定模型的视图也被分组在一起。
- Loose coupling - MVC框架模型,视图或控制器之间的耦合度很低
- Ease of modification - 由于职责分离,将来的开发或修改更加容易
- Multiple views for a model - 模型可以有多个视图
- Testability - 有了更清晰的关注点分离,可以更好地独立测试每个零件
(例如,无需附加视图就可以行使模型)
缺点:
- Code navigability - 框架导航可能很复杂,因为它引入了新的间接层,并要求用户适应MVC的分解标准。
- Multi-artifact consistency - 将特征分解为三个伪像会导致散射。因此,
要求开发人员立即保持多个表示的一致性。
- Undermined by inevitable clustering - 应用程序倾向于在用户看到的内容和用户
使用的内容之间进行大量交互。因此,每个功能的计算和状态趋向于聚集成三个程
序部分之一,从而消除了MVC的优势。
- Excessive boilerplate - 由于应用程序的计算和状态通常被聚类为3个部分之一,
其他部分则退化为样板垫片或代码落后,其存在只是为了满足MVC模式。
- Pronounced learning curve - 对多种技术的了解已成为常态。使用MVC的开发人员需要精通多种技术。
- Lack of incremental benefit - UI应用程序已被分解为组件,并且通过组件体系
结构实现了代码重用和独立性,而MVC却没有获得增量收益。
以Android和iOS平台讨论, xml或者storyborad为view层, Activity(Fragment)或者ViewController
为controller层.
在Android和iOS中, View层太单薄, 只能静态显示Model, 如果Model改变那么View层无能为力.
所以需要controller层中设置View的监听实现用户交互, 并且获取View引用, 用来动态设置
Model内容. Model中的数据处理, 业务处理一般也会写到Controller层中. 这就造成上面说的
Undermined by inevitable clustering
和Excessive boilerplate
.
如果需要完全使用MVC, 那么需要创建Model和View接口ModelImpl和ViewImpl实现, 实别哪些
内容放到三个部分的哪一个部分(MVC中定义不清晰), 然后组合到Controller层. 这样做需要
写很多额外的代码.
MVA是MVC的优化, MVC中View为了监听Model的变化, 需要View与Model关联起来, 添加了
耦合度, 并且不利于复用.
MVA使Controller变成adapter, view和model都与adapter交互, 这样view不需要了解model的格式
和来源; Model不需要了解View是怎么展示的, 所以不需要特定的组合数据适应View.
另外,可以创建多个适配器以更改一个视图显示给定模型的数据的方式。例如,不同的适配
器可能会强加不同的原始数据集,进而对相同的基础数据库和相同的向外展示的网站施加不
同的业务逻辑。在这种情况下,一类各种适配器或中介控制器可以表示同一数据库模型和同
一网站视图之间的业务逻辑变化。
- Model - 该模型是定义要在用户界面中显示或作用的数据的界面。
- View - 该视图是一个被动界面,用于显示数据(模型)并将用户命令(事件)路由到
演示者以对该数据进行操作。
- Presenter - 演示者根据模型和视图进行操作。它从存储库(模型)检索数据,
并将其格式化以显示在视图中。
MVP跟MVA很像, 都是与Adapter(Presenter)交互, 主要区别在控制流程:
MVP: View会触发/创建/调用Presenter, Presenter将使用Model来响应视图
MVA: 当收到消息时, 将选择一个适合的Adapter(可以有多个)作为Model和View的中介
- Model - 模型是指表示真实状态内容的域模型(面向对象的方法),还是表示内容的数据
访问层(以数据为中心的方法)
- View - 就像在模型视图控制器(MVC)模式和模型视图呈现者(MVP)模式中一样,视图
是用户在屏幕上看到的内容的结构,布局和外观。[6]它显示模型的表示并接收用户与
视图的交互(单击,键盘,手势等),并通过数据绑定(属性,事件回调等)将这些操
作的处理转发给视图模型。定义为链接视图和视图模型。
- View model - 视图模型是视图的抽象,公开了公共属性和命令。 MVVM具有绑定程序,可
以自动执行视图及其视图模型中绑定属性之间的通信,而不是MVC模式的控制器或MVP模
式的演示者。视图模型已被描述为模型中数据的状态。[7] 在MVP模式中,视图模型与
Presenter之间的主要区别在于,Presenter拥有对视图的引用,而视图模型则没有。
相反,视图直接绑定到视图模型上的属性以发送和接收更新。为了有效运行,这需要绑
定技术或生成样板代码来进行绑定。[6]
- Binder - 声明性数据和命令绑定在MVVM模式中是隐式的。在Microsoft解决方案堆栈中,
活页夹是一种称为XAML的标记语言。[8]绑定器使开发人员不必编写模板逻辑来同步视
图模型和视图。当在Microsoft堆栈之外实现时,声明性数据绑定技术的存在使这种模
式成为可能[4] [9],并且没有绑定器,通常将使用MVP或MVC并必须编写更多样板文件
(或用其他工具生成它)。
缺点:
- 概括ViewModel是很困难的
- 大规模的数据绑定会消耗很多内存
Reference
Understanding The Difference Between MVC, MVP and MVVM Design Patterns
Understanding Model-View-Controller
MVC vs MVP vs MVVM architecture in Android