当前位置:首页 > 技术知识 > 正文内容

Unity开发者必看!掌握MVC、MVP、MVVM三大架构模式开发效率翻倍

maynowei8个月前 (08-28)技术知识66

在Unity开发中,良好的架构设计是确保项目可维护性、扩展性和团队协作效率的关键。

今天,我们就来和「字符无限科技」深入探讨三种经典的架构模式:MVC、MVP和MVVM。

无论你是Unity新手还是资深开发者,掌握这些模式都能让你的项目开发更加高效、清晰。

这些架构模式,不仅在前端、移动端广泛使用,在Unity项目中也能发挥巨大作用,虽然Unity项目中很难像软件开发一样严格的践行这些架构,但是学习它们也能给我们在游戏架构上提供参考价值。

三种架构模式概述


MVC(Model - View - Controller)

MVC是最早被广泛使用的架构模式之一,它将应用程序分为三个主要部分;

Model:主要是数据管理和后台部分业务逻辑,体现在系统中一般是后台程序,尤其是与数据库交互部分。

View:展示给用户的页面部分,体现在系统中一般是前台页面,或者是其他与用户交互的页面。

Controller:接受用户输入,处理请求,调用后端处理用户交互的接口。

调用流程

用户操作:点击UI按钮

View:将点击事件传递给Controller(通过事件或委托)

Controller:处理业务逻辑,操作Model

Model:更新数据并通知View(可能通过事件、回调或直接访问)

View:接收数据更新并刷新UI展示

优点:

  • 分离关注点,将应用程序分为三个独立的部分,每个部分负责不同的功能。使得代码更加模块化和可维护,降低耦合度。
  • 将业务逻辑(控制器)和界面逻辑(视图)分离,可以提高代码的重用性。比如,同一个控制器可以用于不同的视图,同一个视图也可以使用不同的控制器。
  • 模型、视图和控制器可以分别进行单元测试,它们之间的关系是松散的,测试更灵活。

缺点:

  • 模型和视图的耦合度降低了。但是视图和控制器是紧密耦合的,因为视图需要直接调用控制器来处理用户输入。所以还是存在耦合度高的问题。
  • 如果是复杂的应用,控制器往往会变得臃肿,包含大量的业务逻辑和视图逻辑。会导致控制器的难以维护和测试。

适用场景

MVC适用于大多数Unity项目,特别是那些需要清晰分离数据和界面、注重代码可维护性的项目。

例如,在一个简单的射击游戏中,玩家得分、生命值等数据存储在Model中,得分和生命值的UI显示由View负责,而玩家射击、受到伤害等操作则由Controller处理。

MVP(Model - View - Presenter)

MVP是对MVC的改进,主要区别在于引入了Presenter来替代Controller。Presenter直接与View交互,并负责调用Model中的逻辑。

Model:同MVC,负责后台数据和业务逻辑。

View(接口):用户看到的页面层,但是主要是页面,只有少量的交互逻辑。

Presenter:Persenter接收来自View层的用户输入,并且执行业务逻辑,更新View和Model。

调用流程

用户操作:点击UI按钮

View:将事件传递给Presenter(通过接口)

Presenter:处理业务逻辑,调用Model获取或变更数据

Model:处理数据逻辑

Presenter:将数据返回给View(通过接口)

View:根据Presenter的结果更新界面

优点:

  • 解决了MVC中Controller和View过度耦合的缺点,职责划分明确,更利于维护。
  • presenter承担了view和model之间的交互,满足了单一职责原则,视图数据逻辑是清晰的。

缺点:

  • 当项目越来越复杂时,接口数量变多,Presenter层也将变得越来越臃肿。
  • Presenter 层直接持有 View 层,视图改变,Presenter也需要跟着改(代码逻辑、数据)。

适用场景

MVP适用于那些需要高度解耦、注重可测试性的Unity项目。

例如,在一个复杂的策略游戏中,游戏逻辑复杂,需要频繁地进行单元测试以确保各个模块的正确性,使用MVP架构可以方便地对Model进行测试,同时保持View和Model的独立性。

MVVM(Model - View - ViewModel)

MVVM是Model-View-ViewModel的简写。利用数据绑定机制自动同步 View 与 Model。

Model:同MVC,也是负责后台数据和业务逻辑。

View:同MVC,展示给用户的页面。

ViewModel:通过双向数据绑定机制,自动同步视图和模型之间的变化,减少了手动更新DOM的操作。

如果你熟悉其他前端开发的话,会发现Angular / Vue / Flutter采用的都是这种模式。

调用流程

用户操作:点击UI按钮(或输入数据)

View:通过数据绑定(Binding)自动修改ViewModel中属性

ViewModel:属性变化被监听(INotifyPropertyChanged)

Model:ViewModel调用Model获取或更新数据

ViewModel:数据处理完成后,属性自动更新

View:通过数据绑定,UI 自动响应变化

优点:

  • 低耦合,视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的”View”上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
  • 可重用性,可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
  • 独立开发(前后分离),开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xml代码。
  • 可测试,界面向来是比较难于测试的,而现在测试可以针对ViewModel来写。

缺点:

  • 过于简单的图形界面不适用,增加开发成本(之前Click事件直接搞定,现在需要绑定Command和传参)。
  • 对于大型的图形应用程序,视图状态较多,ViewModel的构建和维护的成本都会比较高。

适用场景

MVVM适用于那些需要高度解耦、注重数据驱动和可维护性的Unity项目。

例如,在一个需要频繁更新UI、展示大量数据的游戏中,使用MVVM架构可以方便地实现数据绑定和UI更新,提高开发效率和代码质量。

MVC、MVP、MVVM的核心区别

我们来对比一下它们之间的一些核心差异:

对比点

MVC

MVP

MVVM

View 与 Model 是否解耦

视图更新方式

Controller 手动更新 View

Presenter 调用 View 接口

ViewModel 数据绑定

是否支持双向绑定

对测试的支持

一般

适合场景

简单 UI 系统

中等复杂交互

大量数据驱动的 UI

在Unity开发中,选择合适的架构模式至关重要。MVC、MVP和MVVM各有优势和适用场景,开发者可以根据项目的具体需求和团队的技术栈来选择最合适的架构模式。

无论选择哪种架构模式,关键在于理解其核心思想,合理划分组件职责,保持代码的低耦合性和高可扩展性,从而构建出高效、可维护的Unity应用程序。

在实际的项目中,也不要刻意的要使用某种架构,架构之间其实没有好坏之分,只有合适与不合适的区别。

相关文章

Axure教程:登录滑动拼图验证交互教学

滑动拼图是互联网一种新的验证形式,被广泛应用在各种网站的登录、注册、找回密码。用户可以不需要填写复杂的验证码,而是用鼠标去拖动滑块便能通过验证。下面为今日头条的滑动拼图验证,接下来将为大家讲解:一、界...

msf系列篇章之七模块详解,黑客必学

1、 mestasploit有很多模块,一共分为七类那如果是kali中自带的msf,它默认的安装路径是在这里。,然后可以看见它这些模块有些相对应的目录。1)、exploits漏洞利用模块,这个模块通常...

CPU「离奇」飙到 100%!开发者挖出 Linux 内核 16 年老 Bug:这么多年竟无人发现?

【CSDN 编者按】每一次对旧设备的升级都仿佛是一场跨越时代的冒险。本文作者致力于将基于 PXA166 的 Chumby 8 设备从 Linux 2.6.28 版本升级到现代 6.x 版本,然而,在看...

Linux系统编程—互斥量mutex(linux 互斥量)

##互斥量mutex前文提到,系统中如果存在资源共享,线程间存在竞争,并且没有合理的同步机制的话,会出现数据混乱的现象。为了实现同步机制,Linux中提供了多种方式,其中一种方式为互斥锁mutex(也...

分析 Rust 程序的火焰图(rust火吗)

分析 Rust 程序的火焰图(Flame Graph)是定位性能瓶颈的核心手段,其核心是通过可视化的函数调用栈和时间分布,找到 CPU 耗时、内存分配、锁竞争等热点。以下是详细的分析方法和步骤,结合...

Linux C++实现多线程同步的四种方式(超级详细)

背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题?通过多线程模拟多窗口售票为例:#include <iostream>#include<pthread.h>#inc...