MVC(Model-View-Controller,模型 - 视图 - 控制器)作为一种经典的软件架构设计模式,其核心价值在于 解耦软件组件、提升开发效率和系统可维护性 ,具体好处可分为以下几个方面:
- 关注点分离(核心优势),实现组件解耦.
- 提高代码的可维护性和可扩展性.
- 便于团队协作,提升开发效率.
- 支持视图的复用与灵活切换.
- 降低代码冗余,提升代码复用性
我们先从数据层(Mode)来分析:
首先第一点,我们前端所使用到的数据分为几种?
> 1、静态数据(像一些资源数据、策划配置等不变的数据)
> 2、动态数据(服务端发送过来的数据)
> 3、临时数据(写在代码里的常量、协议号、查找(国际化、配置表)的一些字段等)
定义动态数据管理器基类
动态数据管理器继承了JTGlobalLIstener
JTGlobalListener是一个门面模式,便于对全局事件及全局函数的管理,在移除时无需一个个移除全局事件或者函数,
定一个伪单例:(管理所有动态数据)
有了数据,肯定是需要事件派发的。
这里我将事件分为了两种类型(绝大多数开发者在事件定义都只写了一个全局事件)
全局函数-----FunctionManager(接收服务端数据派发,通知更新数据管理器)
注:
1、1 对1,一个协议号全局只能有一个对应的回调,
2、做请求响应等待时间比较久时的转菊花很方便,
3、若通信层未做分帧处理跳过。(如果调试喜欢多打断跳来去的,可以改成多个回调的那种)
全局事件-----EventManager(只针对于UI层面的刷新)。是一个回调数据,
说完了数据层、全局事件、全局函数我们来聊聊V和C层吧。
View和Controller一直是一个比较有争议点,
1、很多人直接抛弃了Controller层。逻辑直接写在View层上。
2、也有些人直接用一个新的节点来做C层,将原本的View 层添加这个C层上。
那如何正确的实现Controller.首先先要了解需求,MVC 是将V与M剥离, 业务逻辑写在C层?来保证解耦?
分析需求:
1、如何将V与C建立联系?
2、如何在任意节点正常使用V层对象?
3、如何区分定义V层类型?
4、V层对象在销毁时,C层需不需要销毁?如何销毁?
我的预制体代码是用插件生成出来的自动继承了JTUIComponent,我这里的JTUIComponent就是继承的 Node.(基本上可以达到像FariyGUI那样的代码生成)
加载出来的prefab是继承asset,一般不直接使用,需要结合instantiate,来克隆,
prefab克隆出来的对象都是Node,如果需要自定义V层类型
我使用的方式是
asset[‘data’].constructor = 自定义Class类(继承Node的Class);
let prefab:自定义Class类(继承Node的Class) = instantiate(asset) as any;
注:instantiate这个并不是真 正的克隆,当克隆到结点或资源时,是直接引用的。
controller 是继承GlobalListener,
调用build 方法做为一个controller (C层的入口)
加载完成调用afterComplete,
createComponent – 创建完成预制体直接注册一个NodeEventType.NODE_DESTROYED事件(View 与C层销毁绑定关系)
registerListeners --注册全局事件
notifyComplete-----抽象方法(继承就开始写逻辑)
onRemoveFromStage()----(C层的出口)比如在Popup层,添加某个界面弹出来,只需要传入这个实际的controller就好,
controller.component 是可以直接获取到真实的view界面
当然光有一个controller肯定是 不够的,有很多时候,我们想抽像出来很多种Controller(模块,独立界面、模块组件,场景)的Controller?
这些可以根据项目需求,分析功能来划分设计。
注:在设计的时候要注意,设计的核心就是把一个复杂的过程简单化,并能保证它的安全稳定,如果能做到性能有所提升固然最好.















