前言,在游戏开发中,经常会听到MVC、MVP、MVVM 这类名词,对他们的第一印象多是为了解耦、提高扩展性而选择的软件架构模式,但分别深究它们的区别或优缺点,又往往不得要领,今天笔者就基于Unity游戏开发分别对这三种软件架构模式进行讲解。
一、MVC
1.1 历史背景
MVC模式最早由Trygve Reenskaug在1978年提出[1],是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件架构。MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式透过对复杂度的简化,使程序结构更加直观。软件系统透过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。
1.2 MVC的目的
Unity游戏开发中使用MVC模式主要是为了应对日益复杂的业务需求,不管是从学习成本、健壮性[1]和多人并行开发来考虑,都是非常适合的。所以MVC模式也是在游戏开发中(特别是外围系统)使用非常广泛的一种架构模式。
1.3 MVC的架构模式
- Model - 数据层,负责处理数据相关的操作。这部分多数只管能否做,而不考略是否应该做。
- View - 视图层,用户的界面。例如:对界面组件的持有、不含业务逻辑的开关等操作。
- Controller- 控制层,业务逻辑所在的层级。这部分是判断是否应该做、如何做的地方。
1.4 MVC的架构示例图
它们的依赖关系或数据的走向常规有以下3种,而第三种也是使用最频繁的一种(其实项目中多数是使用第三种的变种)
1.5 示例图解析
示例图【一】
View层接收到用户的输入,将接收到数据信息推送到Controller层,Controller层收到View的数据,进行下一步的解析和整合,将整合好的数据在推送到Model层,Model层接收到Contoller层整合后的数据,如果需要更新View层(界面),就会向View发送消息通知更新界面。
示例图【二】
与示视图【一】最大的区别就是数据的流向都是是双向的。基于第一张图的说明补充为什么是双向的。
- View层为什么会直接到Model层?
因为有一些界面产生的数据是不需要Controller层进行解析或整合,可以直接被Model层所使用。例如基于分析用户行为的打点,其实只是向数据库发送是否点击,没有其他的业务逻辑,所以理论上可以直接发送到Model层。 - Controller层为什么会直接到View层?
因为一些操作不涉及Model层,仅仅是表现上的差异,所以Controller层就可以直接操作View层来控制表现上的差异。例如:不需要同步配置的装饰性UI,圣诞节雪花、万圣节偶尔飞过的蝙蝠等等。 - Model层为什么会直接到Controller层?
因为Model层所发出的所有数据并不是都可以被View直接使用的,需要二次的解析或整合成可用的数据,然后再由Controller层推送的View层。例如:Model层下发一个用户设置的数据结构,里面有声音、画质、各种偏好等等都在一个数据结构中,这个时候就需要发送到Controller层进行解析,然后根据解析的内容分别推送到View层。
示例图【三】
与示例图【二】的区别是断开的了View层到Model层方向的连接,这么做的主要目的是提高各个层级的内聚性,尤其是提高Controller层的内聚性,更好的控制数据的流向与业务逻辑的管理。
对于MVC模式的运用没有绝对的标准,在WPF、Web、IOS、Android、Unity开发都有各自演变,其不变得主旨是对于 数据-