MVC/MVP正确的打开方式

MVC(Model-View-Controller,模型 - 视图 - 控制器)作为一种经典的软件架构设计模式,其核心价值在于 解耦软件组件、提升开发效率和系统可维护性 ,具体好处可分为以下几个方面:

  1. 关注点分离(核心优势),实现组件解耦.
  2. 提高代码的可维护性和可扩展性.
  3. 便于团队协作,提升开发效率.
  4. 支持视图的复用与灵活切换.
  5. 降低代码冗余,提升代码复用性

我们先从数据层(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?

这些可以根据项目需求,分析功能来划分设计。
注:在设计的时候要注意,设计的核心就是把一个复杂的过程简单化,并能保证它的安全稳定,如果能做到性能有所提升固然最好.

1赞

不明觉厉,我顶

十几年前MVC模式在web开发里风头正劲,java/php等到处都是mvc名词/各种开源库。
我还模仿springmvc写过一个qingmvc :innocent:

视图直接从模型中取得它需要显示的状态,这种耦合会不会高了啊。

我前几年也有用TS仿造过springMVC 的注解。 :crazy_face:

用的第一款mvc是开源框架puremvc :sweat_smile:

此图出自headfirst设计模式。

除了中大型游戏,真正的小游戏谈什么MVC和MVVM有点扯,只需要良好的UI管理和通过功能职责划分好文件就行,否则就是简单的事情搞复杂

1赞

[/quote]

你以前是做As3的
吧。我以前做AS3的时候也有用过pureMVC .

[/quote]

小游戏也可以用的,不管大小型项目都适合。有结构肯定是没有结构更容易管理及维护的。
设计模式就是解决这样问题的呀,比如MVC,划分视图该干嘛,模型是负责啥的,控制器做什么?

只要是设计模式那它肯定是为了解决某种问题而产生的,如果只是做一些工具类的话,你说的这种我有做过的,但是界面,UI这种带复杂交互的这样做我还是坚持我这种。 :joy:

你问问豆包。“MVP,mvc,mvvm,purmvc 对比”。

数据,控制,显示,分开就行了,至于是控制器调用view刷新,还是model事件通知view更新,问题不大,怎么关联问题不大

1赞

其实prefab 就已经算是V 层了。如果再引入一个V,逻辑链路会很长。所以通常都是组件充当C
层。有集中管理的,比如网络请求,或者是代码复用的再单独抽Mgr。这个是目前我认为最高效的开发模式设计。

另外说下puremvc 的 cmd 太麻烦,每个逻辑块都要建立文件,消息满天飞,代码链路查看非常不方便。不利于后期维护。

这种是需要使用find获取组件吗?

不需要的。直接通过View’.'属性,就可以访问到组件或者节点,而且也是支持嵌套预制体、嵌套Node节点等操作的。不过是需要插件生成代码的。

你的插件做了什么?节点和view如何关联的?

分析.Prefab文件,逆向生成对应的代码啊。
我是自定义的Node。


重写Prefab._instantiate方法

插件会把对应的组件、节点、子预制体直接给当前的预制体。(子预制体内存看是Node ,但是我插件生成的是对应的Class类型),它也是可以View"."出来的。

我继承的原因是,我写了插件是可以自动生成预制体代码以及嵌套预制体的代码都可以正常使用的。


如果UI上有改动,我可以借助VS CODE快速定位报错的。
我明白你说的意思的。如果按你的思路,那肯定是有一个加载资源的类,来管理所有加载的。那你是如何划分,module,moduleComponent, 或者独立界面(panel),或scene这些的呢?