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

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

maynowei10个月前 (08-28)技术知识94

在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应用程序。

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

相关文章

单片机C语言编程,心得都在这里了

单片机写代码总踩坑,头文件被无视,老工程师的经验哪里来?前几天写8x8矩阵键盘的程序,搞了三天代码一直乱报错。后来发现自己连头文件是什么都不清楚,之前写的都是小程序,压根没碰过.h文件。看别人的程序都...

C++并发同步核心-mutex深度解析:守护共享数据的关键

在多线程编程中,当多个线程需要访问和修改共享数据时,如果没有任何同步机制,就可能发生数据竞争(Data Race),导致程序行为不可预测、数据损坏甚至崩溃。C++标准库通过<mutex>头...

C++ 原子操作与锁的深度解析:为什么原子操作并非万金油?

大噶好,我是henry,今天来和大家浅浅聊一下为啥C++原子操作并非万能钥匙,原因有三,且听我娓娓道来:一、原子操作的线程安全性C++11 的 std::atomic 确实为单个变量的线程安全操作提供...

从 async/await 到虚拟线程:Python 并发的再思考

演进之路:从async/await到线程的反思首先必须明确的是,async/await对Python并非全无裨益:它最大的价值,是让更多人接触到了并发编程。通过在编程语言中嵌入语法元素,并发编程的门槛...

不需安装oracleclient连接oracle数据库方案

在Oracle官方发布ODP.net之前,我们通常使用微软的System.data.OracleClient进行Oracle数据库操作,它的缺点是必须要装Oracle客户端OracleClient,如...

python-oracledb——利用python连接Oracle数据库的好用方法

这篇文章最早发布在CSDN了,最近想尝试使用一下头条,重新转移过来了。背景介绍之前使用的数据库一直是MySql,偶尔使用PostgreSQL,都是利用的数据库连接池使用;最近需要在Oracle数据库取...