• 【Unity 框架】QFramework v1.0 使用指南 工具篇:10. 架构规范 与 推荐用法 | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏


    QFramework 架构提供了四个层级:

    • 表现层:IController
    • 系统层:ISystem
    • 数据层:IModel
    • 工具层:IUtility

    除了四个层级,还提供了 Command、Query、Event、BindableProperty 等概念和工具。

    这里有一套层级的规则,如下:

    • 表现层:ViewController 层。IController接口,负责接收输入和状态变化时的表现,一般情况下,MonoBehaviour 均为表现层
      • 可以获取 System、Model
      • 可以发送 Command、Query
      • 可以监听 Event

    Controller 的接口定义如下:

    #region Controller
    
    public interface IController : IBelongToArchitecture, ICanSendCommand, ICanGetSystem, ICanGetModel,ICanRegisterEvent, ICanSendQuery
    {
    }
    
    #endregion
    
    • 系统层:System层。ISystem接口,帮助IController承担一部分逻辑,在多个表现层共享的逻辑,比如计时系统、商城系统、成就系统等
      • 可以获取 System、Model
      • 可以监听Event
      • 可以发送Event

    System 的接口定义如下:

    #region System
    
    public interface ISystem : IBelongToArchitecture, ICanSetArchitecture, ICanGetModel, ICanGetUtility,ICanRegisterEvent, ICanSendEvent, ICanGetSystem
    {
        void Init();
    }
    
    • 数据层:Model层。IModel接口,负责数据的定义、数据的增删查改方法的提供
      • 可以获取 Utility
      • 可以发送 Event

    Model 的接口定义如下:

    public interface IModel : IBelongToArchitecture, ICanSetArchitecture, ICanGetUtility, ICanSendEvent
    {
        void Init();
    }
    
    • 工具层:Utility层。IUtility接口,负责提供基础设施,比如存储方法、序列化方法、网络连接方法、蓝牙方法、SDK、框架继承等。啥都干不了,可以集成第三方库,或者封装API

    Utility 的接口定义如下:

    #region Utility
    
    public interface IUtility
    {
    }
    
    #endregion
    
    • Command:命令,负责数据的增删改。
      • 可以获取 System、Model
      • 可以发送 Event、Command

    Command 的接口定义如下:

    public interface ICommand : IBelongToArchitecture, ICanSetArchitecture, ICanGetSystem, ICanGetModel, ICanGetUtility,ICanSendEvent, ICanSendCommand, ICanSendQuery
    {
        void Execute();
    }
    
    • Query:查询、负责数据的查询
      • 可以获取 System、Model
      • 可以发送 Query
    public interface IQuery<TResult> : IBelongToArchitecture, ICanSetArchitecture, ICanGetModel, ICanGetSystem,ICanSendQuery
    {
        TResult Do();
    }
    
    • 通用规则:
      • IController 更改 ISystem、IModel 的状态必须用Command
      • ISystem、IModel 状态发生变更后通知 IController 必须用事件或BindableProperty
      • IController可以获取ISystem、IModel对象来进行数据查询
      • ICommand、IQuery 不能有状态,
      • 上层可以直接获取下层,下层不能获取上层对象
      • 下层向上层通信用事件
      • 上层向下层通信用方法调用(只是做查询,状态变更用 Command),IController 的交互逻辑为特别情况,只能用 Command

    通用规则是理想状态下的一套规则,但是落实的实际项目,很有可能需要对以上规则做一些修改。

    修改的方式非常简单,比如我希望 IController 可以发送事件,那么我们只需要在 IController 接口上增加一个 ICanSendEvent 接口即可,代码如下:

        #region Controller
    
        public interface IController : IBelongToArchitecture, ICanSendCommand, ICanGetSystem, ICanGetModel,
            ICanRegisterEvent, ICanSendQuery,
            ICanSendEvent // +
        {
        }
    
        #endregion
    

    这样,就可以在 Controller 对象里,通过 this.SendEvent 来发送事件了。

    如果是打算先了解或学习 QFramework 架构,那么我推荐就先按照 QFramework 默认的架构规范来做练习项目。

    如果是打算马上用 QFramework 做项目,那么可以再保持原有开发习惯的基础上,一点点引入 QFramework 的概念,比如一开始用 BindableProperty 和 Architecture 来解决 Model 和数据更新的问题。

    再慢慢开始用 Command 来解决交互逻辑臃肿的问题,以此类推,直到能完全掌握全部概念,最终能修改和定制 QFramework.cs 源码。

    更多内容

  • 相关阅读:
    java动态代理(JDK和cglib实现对比)
    SynchronizedMap和ConcurrentHashMap 区别
    Spring五个事务隔离级别和七个事务传播行为
    Java 得到磁盘以及内存信息
    java Properties类得到当前的系统属性
    Java Runtime 详解
    java多线程设计模式
    java 得到以后的日期
    apache 配置
    centos7 安装keepalived
  • 原文地址:https://www.cnblogs.com/liangxiegame/p/16798639.html
Copyright © 2020-2023  润新知