MVC设计模式的介绍

继续程序入门介绍系列,这次来说一下稍微复杂的东西。

一、Unity项目使用框架有什么好处

以前有段时间我很喜欢在qq群里面回答问题,后来渐渐的也没太多时间回答了,所以变成了偶然看看别人讨论的过程。我后来发现,很多朋友都只是注重功能的实现,当实现了某个功能之后,就很高兴,觉得自己已经达到了一定的水平了。甚至有朋友直接的说,我能实现功能就够了,用Unity开发根本不需要用什么框架。

出现这种思想,我觉得有很大一部分原因是Unity官方造成的。因为Unity引擎在刚推出来的时候,宣传的是组件拼装的思想,而大部分demo都是针对某个具体功能展示而制作的。

所谓的组件拼装思想,就是我有一个空的GameObject,只带了最基本的Transform组件,可以控制位移旋转缩放。如果用户需要在上面添加功能,就可以添加相应的组件。比如我需要把一个空物体变成摄像机,只需要在空物体上面添加Camera组件,如果想这个摄像机同时有碰撞的功能,就再在上面加多个Collider碰撞组件,如果想这个物体顺便会发光,那就再添加一个Light的组件。假如需要更复杂的功能,可以自己写一个继承MonoBehaviour的脚本挂上去,因为MonoBehaviour脚本对于Unity来说也是一种组件。这样用户就可以抛弃面向对象的子类继承基类之类的繁琐结构,直接通过编辑器界面实现各种自由的功能。

所以,Unity引擎刚推出来的时候是偏向于给美术和策划用的,很多所见即所得的功能让你很简单就能实现想要的功能,很适合做规模较小的独立游戏。所以在这个阶段,Unity的确用不用框架好像没多大的区别。

但随着Unity的快速兴起,很多厂商开始拿Unity来做一些大型的项目。这个时候,很明显单一的功能实现已经不能满足项目的需要了。因为大型项目一般不会为某个功能的实现而发愁,更注重的是项目的清晰、易于维护和扩展等问题。由于有规模的项目都是多人协助一起写的,所以更需要注意项目代码的结构和质量。

好的代码标准,一般来说是高内聚,低耦合。我们需要把功能分离,让各人写的代码互不影响又能互相支持,可以单独的修改或者维护某一部分的代码而不影响到其他功能,代码可以重复利用,等等。为了达到这些目的,我们会使用一些设计模式,设计游戏的框架。

MVC是解决这个问题比较常见的一种设计模式,它不是一个具体的框架,而是一种设计的思想。可以根据这种设计的思想,写出适合项目用的框架。

二、MVC设计模式的特点

举一个稍微具体一点的例子来说明,我们现在需要做一个功能,可以在界面上面输入新增用户数据,然后列表显示出来。

如果是最简单的实现,我们可以只建立一个类,然后写代码实现三部分功能:

1、建立一个List来存储用户数据。

2、在类里面绘制一个显示列表来显示现有的用户数据,并绘制一个输入框和一个按钮来新增用户数据。

3、写一个添加用户数据的方法,把输入框的内容添加到用户数据的List。

这样就把这个功能实现了。但假如我需要对需求做一些改变,比如我需要修改一下显示列表的位置和大小,或者我需要给数据存储加一个防止重复的功能,或者这个用户数据需要在其他功能也用到。在需求变动的情况下,这个类本身就需要不停的改变。等功能复杂到一定程度之后,这个类可能就会非常臃肿而难于维护了。

为了解决这个问题,我们可以尝试着把这个类拆分一下。

我们把一个类拆成三个类,分别是view类、model类和controller类。

view类里面写了现实列表的绘制方法,还有输入框和按钮的绘制。可以通过事件通知它数据改变而刷新界面上的数据显示。

model类里面写了用户数据的存储List,提供查询方法,还有数据变化时向外抛事件通知别人。

controller类里面写了按钮触发的方法,可以把view类输入的新增用户写到model里面。

这样分割了之后,某些功能相对的就稳定下来了。当我只需要调整界面外观时,我可以单独的修改view类,其他功能想使用用户数据,可以直接访问model类取得,而需要对操作过程加特殊的方法,只需要单独的修改controller类。另外一个好处是,这样在其他层面的逻辑还没写好之前,单独的层面就可以先编写。比如我还没确定这个界面样式是怎样摆放的,但我可以先把控制层和数据层写好,等显示界面层做好了之后,接入一下就行了。

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。一般的理解model层是数据的存储,view是界面的展示,controller是控制输入逻辑。

上面这个例子简单了介绍了MVC模式的工作原理,核心的思想就是,把功能分层,特别是把显示和数据分开,然后用另外一个层级让它们2个层级联合起来工作。

三、MVC模式的进化

MVC的确是现阶段广泛应用的一个设计模式,有很多使用这个模式写的框架。在使用过程中,会根据一些实际的情况去修改一些结构上的东西。

比如,MVC虽然是把功能分层了,但从最传统的MVC结构来说,View层是可以访问Model层的,比如View层可以直接去Model层查询数据并刷新自己的界面。这个时候,会发现三个层面是形成了一种三角的关系,有时候会存在需要同时维护三个层面的逻辑交互关系。

于是,后来MVC发展出了MVP(Model-View-Presenter)模式。这个模式里面,切断了Model层和View层的关联,view层只和Presenter层交互,再通过Presenter层和Model层交互。

这样,Model和View层就完全切断了关联,大部分的逻辑实现出现在Presenter层里面。而Presenter层通过向View层提供接口方法,实现了数据的查询和刷新等功能。这样做之后,当某个层面出现了修改的需要,他都只需要和Presenter层交互,所以不需要影响到另外一个层面。

MVC模式发展的另外一个方向,是MVVM(Model-View-ViewModel)。这里提出了一个叫做ViewModel的层面,一个View的类,一般会对应一个单独的ViewModel类,这个类完全为对应的View类服务,包括了View上面每一个显示数据的刷新显示、输入逻辑等等。然后ViewModel类再和Model类做交互。这样的情况下,在没有View类的情况下,ViewModel类已经完全可以实现了所有功能,只是没有把界面绘制出来而已。当有了View类,数据自然而然就会显示在界面上面了。

MVVM模式的2点比较突出的优点,第一是数据绑定,通过ViewModel层自动更新View层和Model层。第二是可以做界面功能的自动测试。因为在完全不需要显示View显示的情况下,通过调用ViewModel提供的各种接口,你等于已经完整的操作这个界面了。

四、一些个人看法

上面说了这么多MV什么的模式,估计都看懵了吧?实际上不管是MV什么,表达的核心思想都是一样的,显示层和数据层必须分离,然后第三层的作用都是用于沟通这两个层的。至于在实际应用中他们的关联交互程度应该具体怎样写,还是需要看你对这些设计模式的理解,还有你项目的具体需要。

对于新手来说,起码能有分层的概念,先可以看懂别人的框架结构。然后在使用别人的框架做功能的时候,可以根据分层的思想,把代码集中在对应的层面去编写。最后,在学习了现有的框架的写法之后,可以尝试着自己去写一些简单的框架,再一步一步的完事,就可以拥有一套属于自己的框架了。

你不知道的SAM V系列MCU:SAM V MCU基于 ARM Cortex:trade_mark:-M7 的微控制器系列可提供最佳的连接接口组合,包括以太网 AVB、MediaLB、USB 和 CAN-FD,以及可提供高达 1500 CoreMark 的高性能 ARM Cortex-M 内核。SAM V MCU专注于音频放大器、汽车通信控制单元或车头单元的车载信息娱乐链接。 关键特性: 高性能—由于 Cortex-M7 能够以 300 MHz 的频率运行,外加前所未有的 DSP 性能,可实现高达 1500 CoreMark 先进的存储器架构— 高达 384 KB 的多端口存储器,其中高达 256 KB 可分配作为紧密耦合存储器(数据和指令),实现以 300 MHz 频率运行时零等待 以太网 AVB— SAM V71 在以太网 MAC 中嵌入了对音频视频桥接 (AVB) 的特定硬件支持。在 MAC 的硬件中实现了基于信用的流量整形,从而无需 CPU 干预 高速 USB— 主机和器件模式高速 USB 控制器集成了 PHY 以降低 BOM 成本 MOST 连接— MediaLB 3 线接口可无缝集成到 MOST 总线 音频接口— 灵活的 TDM/I2S 接口可以连接音频源、编解码器或 DSP CAN-FD— 最新的 CAN 2.0 和 CAN 灵活数据速率 (FD) 控制器可实现更高带宽 汽车等级— 通过 AEC-Q100 等级 2 (-40C/105C) 认证 2015年最新评估开发板——SAM V71 Xplained Atmel年初刚刚推出了基于SAM V71Xplained评估套件,目前已在官网发布出售。 开发板资源: 处理器:ATSAMV71Q21(ATSAMV71Q21数据手册) 用户:一个电源开关按钮、一个机械复位按钮、两个用户按钮、两个黄色LED指示灯 存储:2MB SDRAM、2MB QSPI Flash、256KByte EEPROM 网口:IEEE 802.3az 10Base-T/100Base-TX Ethernet RMII PHY 媒体接口:立体音频编解码器、相机接口、耳机和麦克风接口 SDIO接口SD连接器、CAN收发器 MediaLB接口 接口:外部调试连接器接口、一个扩展LCD接口、两个外部扩展接口、调试接口、虚拟COM口、USB接口 电源:外部电源输入、USB供电 用到的主要芯片: 基于 ARM Cortex:trade_mark:-M7 的微控制器:ATSAMV71Q21 AVR 32-bit RISC MCU:AT32UC3A4256J CAN收发器:ATA6561-GBQW 超低功耗、便携式音频编解码器:WM8904 IEEE 802.3az 10Base-T/100Base-TX Ethernet RMII PHY:KSZ8061RNBVA 2kbit I2C EEPROM:AT24MAC402-MAHM-T
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值