• QFeamework中的MVC


    什么是MVC:

    模型-视图-控制器模式,也称为MVC模式(Model View Controller)。用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。它把软件系统分为三个基本部分:

        模型(Model):负责存储系统的中心数据。

        视图(View):将信息显示给用户(可以定义多个视图)。

        控制器(Controller):处理用户输入的信息。负责从视图读取数据,控制用户输入,并向模型发送数据,是应用程序中处理用户交互的部分。负责管理与用户交互交互控制。

      视图和控制器共同构成了用户接口。

      且每个视图都有一个相关的控制器组件。控制器接受输入,通常作为将鼠标移动、鼠标按钮的活动或键盘输入编码的时间。时间被翻译成模型或试图的服务器请求。用户仅仅通过控制器与系统交互。


     QFramework的MVC:

    上面简单的介绍了什么是MVC,让有的同事进一步的了解一下。

    QFramework 基于 MVC 的开发模式

    所以我们先从最熟知的 MVC 架构开始着手 QFramework 的学习。


    实例说明:

    有些技术只靠文字不能形象的进行表达和说明,那么我们就通过一些简单的功能来反应技术的点有什么的不同之处

    首先我们再unity中搭建一个简单的计数器功能,通过加减来控制技术器的数值变化:

    然后我们用平时我们最常用的方法实现它

     

    1. using UnityEngine;
    2. using UnityEngine.UI;
    3. // Controller
    4. public class CounterAppController : MonoBehaviour
    5. {
    6. // View:在 QFramework 的 MVC 定义里就是提供关键组件的引用
    7. private Button mBtnAdd;
    8. private Button mBtnSub;
    9. private Text mCountText;
    10. // Model:非常简单,只有一个成员变量,但是在这里它其实并不算是一个 Model,他只是要在
    11. // View 中显示的一个数据而已
    12. private int mCount = 0;
    13. void Start()
    14. {
    15. // View 组件获取
    16. mBtnAdd = transform.Find("BtnAdd").GetComponent
    17. mBtnSub = transform.Find("BtnSub").GetComponent
    18. mCountText = transform.Find("CountText").GetComponent();
    19. // 监听输入
    20. mBtnAdd.onClick.AddListener(() =>
    21. {
    22. // 交互逻辑
    23. mCount++;
    24. // 表现逻辑
    25. UpdateView();
    26. });
    27. mBtnSub.onClick.AddListener(() =>
    28. {
    29. // 交互逻辑
    30. mCount--;
    31. // 表现逻辑
    32. UpdateView();
    33. });
    34. UpdateView();
    35. }
    36. void UpdateView()
    37. {
    38. mCountText.text = mCount.ToString();
    39. }
    40. }

     目前像技术器这样的逻辑,以上代码完全没有问题的,但是,如果需要添加大量的业务逻辑呢?我们想一下,可能有的同学说来什么功能就加什么功能呗。

    其中很有可能让 mCount 在多个 Controller 中使用,甚至需要针对 mCount 这个数据写一些其他逻辑,比如增加 mCount 则增加 5 个分数,或者 mCount 需要存储等,总之 mCount 在未来可能会发展成一个需要共享的数据,而 mCount 目前只属于 CounterAppController,显然在未来这是不够用的。

    我们就需要让 mCount 成员变量变成一个共享的数据,最快的做法是吧 mCount 变量变成静态变量或者单例,但是这样虽然写起来很快,但是在后期维护额度时候会产生很多的问题。而QFramework架构提供了Model的概念,那么我们就要用他的方法进行实现,那么当我们将QFramework导入工程之后,我们需要对代码进行修改:

    1. using UnityEngine;
    2. using UnityEngine.UI;
    3. // 1. 定义一个 Model 对象
    4. public class CounterAppModel : AbstractModel
    5. {
    6. public int Count;
    7. protected override void OnInit()
    8. {
    9. Count = 0;
    10. }
    11. }
    12. // 2.定义一个架构(提供 MVC、分层、模块管理等)
    13. public class CounterApp : Architecture<CounterApp>
    14. {
    15. protected override void Init()
    16. {
    17. // 注册 Model
    18. this.RegisterModel(new CounterAppModel());
    19. }
    20. }
    21. // Controller
    22. public class CounterAppController : MonoBehaviour , IController /* 3.实现 IController 接口 */
    23. {
    24. // View
    25. private Button mBtnAdd;
    26. private Button mBtnSub;
    27. private Text mCountText;
    28. // 4. Model
    29. private CounterAppModel mModel;
    30. void Start()
    31. {
    32. // 5. 获取模型
    33. mModel = this.GetModel();
    34. // View 组件获取
    35. mBtnAdd = transform.Find("BtnAdd").GetComponent
    36. mBtnSub = transform.Find("BtnSub").GetComponent
    37. mCountText = transform.Find("CountText").GetComponent();
    38. // 监听输入
    39. mBtnAdd.onClick.AddListener(() =>
    40. {
    41. // 6. 交互逻辑
    42. mModel.Count++;
    43. // 表现逻辑
    44. UpdateView();
    45. });
    46. mBtnSub.onClick.AddListener(() =>
    47. {
    48. // 7. 交互逻辑
    49. mModel.Count--;
    50. // 表现逻辑
    51. UpdateView();
    52. });
    53. UpdateView();
    54. }
    55. void UpdateView()
    56. {
    57. mCountText.text = mModel.Count.ToString();
    58. }
    59. // 3.指定架构
    60. public IArchitecture GetArchitecture()
    61. {
    62. return CounterApp.Interface;
    63. }
    64. private void OnDestroy()
    65. {
    66. // 8. 将 Model 设置为空
    67. mModel = null;
    68. }
    69. }

    代码引入了两个新的概念,一个是 Architecture,另一个是 Model。Architecture 用于管理模块,或者说 Architecture 提供一整套架构的解决方案,而模块管理和提供 MVC 只是其功能的一小部分。

     

    这里要注意一点,Model 的引入是为了解决数据共享的问题,而不是说单只是为了让数据和表现分离,这一点是非常重要的一点。数据共享分两种:空间上的共享和时间上的共享。空间的共享很简单,就是多个点的代码需要访问 Model 里的数据。时间上的共享就是存储功能,将上一次关闭 App 之前的数据存储到一个文件里,这次打开时获得上次关闭 App 之前的数据。虽然我们上手了 MVC,但是这样的 MVC 还有很多问题,我们下一篇继续解决。

  • 相关阅读:
    Golang学习:基础知识篇(二)—— 数组及切片
    SpringBoot整合Swagger
    人工神经网络的基本模型,神经网络解剖学模型图
    IDEA安装与配置
    安防视频监控平台EasyCVR集成到ios系统不能播放是什么原因?如何解决?
    k8s 服务升级为啥 pod 会部署到我们不期望的节点上??看来你还不懂污点和容忍度
    webpack
    Android—Surface,BufferQueue
    AWS认证SAA-C03每日一题
    JS实现中文转拼音首字母和五笔简码
  • 原文地址:https://blog.csdn.net/LiKe11807/article/details/126481913