双mvc框架

双mvc框架

[\1/]新写的lua mvc 框架,支持4种mvc 写法:

1、可以按照传统mvc(pureMVC)来写,但是command要写在控制器里面,因为框架的控制器和视图基类都是抽象了消息列表接口;mediator现在是兼中介者和视图逻辑,就是不必组合的视图最后的视图逻辑都放mediator里面,因为游戏不是强组件特质,游戏应该更多样

2、控制器ctrl和view 都不使用事件机制,就是简单mvc的形式,之间通讯用调用接口(函数)的形式,有一个单独的网络层,负责发送和接收消息,model在这里没有了(组织数据都在ctrl),数据都存在ctrl 里面用表或其他结构简单的表示

3、控制器ctrl和view 都不使用事件机制,就是简单mvc的形式,之间通讯用调用接口(函数)的形式,model层组织数据和访问网络,model就是域逻辑,model就是一个远端代理,model层只对外提供数据获得接口,这里model其实就是传统mvc的model(只是不是通过发消息通知其他层,没了消息模式),model对象不会引用到其他ctrl 或者 view,ctrl或者view 在使用model的时候注册回调函数

4、控制器ctrl和view 都不使用事件机制,就是简单mvc的形式,之间通讯用调用接口(函数)的形式,有一个单独的网络层,负责发送和接收消息,data对象组织数据(也提供查找数据的方法),被ctrl持有,并且view也可以使用,data对象不调用ctrl或者view的方法([\4/+=2]data对象不包含业务逻辑)

5、当然这样的框架混合写才是最好,用传统mvc写游戏核心部分,用简单mvc写其他次要系统,最推荐的简单mvc写法是(2、),(3、)其次,(4、)在lua里面显得略臃肿

6、这里(3、)的简单mvc模式之所以model不直接引用到ctrl或者view,是因为如果引用到,那么这种写法和(2、)或(4、)的写法就没差别了,数据不是在model就是在ctrl 或者单独建个文件,还不如选一种(2、)或者(4、)的写法(一个系统的协议很多,如果协议没封装就很多函数,model层看起来就很庞大了)。model不引用到其他层对象,其他层改变不会影响到model层,并且这样也利于思考(逻辑可以很直观的分为域逻辑和事务逻辑)。虽然model直接引用(调用)ctrl或者view的形式逻辑也是分为域逻辑和事务逻辑,但是model不引用到其他层对象的时候,即便model对象变得很庞大了,修改控制层(ctrl)代码的时候也会变得容易些。修改控制层(ctrl)也是很经常的。

[/2+#+=2]写法(1、)(2、)(3、)(4、)(5、)和分析(6、)都是重要的

[/3+#+=2]分析(6、)是确定的

[/4]Command可能被用于实现一些复杂、必须按照一定顺序的系统行为,上一步动作的结果可能会流入一下个动作。(引用自《pureMVC》,这就是业务逻辑)

[/1] 
enter image description here

AppExtBase 中的派发消息接口 
title

AppExtBase 中注册和移除 控制器、模型接口 
title

AppExtBase 中注册和移除 视图接口 
title

ControllerBase 
title

ViewBase 
title

ModelBase的get和set接口,有只读属性才使用它,因为这个是方便写应用的(组件式的写法要用到),要明了的声明类实例的属性也可以用它([\10/]明了的声明类实例的属性) 
title

[/10] 
title

[/11+=2]写法3在model注册回调的时候,model支持注册一组回调(model依次调用),这样它其实就是向下兼容的,你只注册一个回调也可以。例:角色hp过低,血条会变化、屏幕也会闪烁;这就是多个回调的情况。

[/12+=2]其他写法的ctrl或者view也不应该被model引用(这个model指写法3的model);如果其他系统是在这个系统之前开发,那么调用接口(model引用到其他写法ctrl或者view)也不错,因为这个时候其他已写好的系统改动就不是经常的了([\15/]通常已写好的系统重构也可以兼容接口,即使服务端重构也可以兼容接口来重构,因为系统的行为通常不变(除非策划改了))。

[\12/+/13+=2]如果在写当前系统的时候也用适配接口的方法来达到不修改model的目的(写法3),这样容易产生不良代码(不易读或者逻辑复杂的代码),不安全。

[/14+\12,13/+=2]所有系统、所有层的接口都应该是一个标准接口(规范化的接口),这样依据数学模型的接口才能发挥多态的强大。

[/15+\14,12/+=2]如果重构的系统接口行为有所差异了,并且依据原有行为接口兼容形式的写法会带来较大的性能损失,那么笔记12的兼容接口重构是不适用的。

  1. [\11/+/16\+正常运行]
  2. //>>>>>>>>>>>>>
  3. --
  4. -- Author: xiaowa
  5. -- Date: 2015-10-17 07:53:29
  6. --
  7. --框架回调对象
  8. local CallBack = CallBack or class("CallBack")
  9. local call_hash_ = call_hash_ or app.util.HashMap.new()
  10. --e_name 注册回调的事件名
  11. function CallBack:ctor(e_name)
  12. self.e_name_ = e_name
  13. call_hash_:setElement(e_name,self)
  14. end
  15. function CallBack:call(...)
  16. local n = table.getn(self)
  17. for i=1,n do
  18. self[i](…)
  19. end
  20. end
  21. function CallBack:register_call(fun)
  22. table.insert(self,fun)
  23. end
  24. function CallBack.register(e_name,fun)
  25. local callback = call_hash_:getValue(e_name)
  26. callback:register_call(fun)
  27. end
  28. return CallBack
  29. //<<<<<<<<<<<<
  30. [/17\+正常运行]
  31. //>>>>>>>>>>>>>>>>>>
  32. function LoginCtrl:ctor()
  33. --测试回调对象
  34. self.print_ = app.compose.CallBack.new(TEST_CALLBACK)
  35. end
  36. function LoginCtrl:enterLoginScene()
  37. self.login_view_:open()
  38. self.print_:call("this is callback on LoginCtrl")
  39. end
  40. TEST_CALLBACK = "test_callback"
  41. function LoginView:open()
  42. display.replaceScene(self.scene_)
  43. local num = 1
  44. local function fun1(str)
  45. printLog("xiaowa",str.." in "..num)
  46. num = num+1
  47. end
  48. local function fun2(str)
  49. printLog("xiaowa",str.." in "..num)
  50. num = num+1
  51. end
  52. app.myApp:register(TEST_CALLBACK,fun1)
  53. app.myApp:register(TEST_CALLBACK,fun2)
  54. end
  55. //<<<<<<<<<<<<<<<<<

[\16,17/+=2]笔记16、17是注册回调的代码,回调只能注册,不能删除,这样回调就像直接调用的形式;回调需要定义全局事件名;如果想用能删除的形式,请用事件。

[/18+=2]最后,那个ModelBase基本没用(只读属性在尾部加”_”,自己写get方法),要么留一个空ModelBase类,要么就不继承直接写Model类。


<think>嗯,用户让我介绍一下MVC框架。首先,我需要确认用户对MVC的了解程度。可能他们是个开发者,或者刚开始学习编程,想了解设计模式方面的内容。MVC是一个经典的设计模式,广泛应用于Web开发和其他应用开发中。我需要先解释MVC的基本概念,然后分解各个组件的作用,再举一些例子帮助理解。 用户之前的提问是关于如何学习操作系统的,现在转向MVC框架,可能他们正在学习软件架构或者Web开发。我需要保持回答的结构清晰,确保用户能够逐步理解。可能用户需要知道MVC的组成部分、各部分的职责以及它们之间的交互方式。此外,实际应用中的例子会有帮助,比如在常见的框架如Spring MVC、Ruby on Rails中的使用。 还要注意用户可能想知道MVC的优势和适用场景,以及与其他模式的区别,比如MVVM。不过当前问题主要是介绍,可能需要先聚焦在MVC本身,如果有必要再简要对比。同时,用户可能希望了解如何正确使用MVC,避免常见错误,比如把业务逻辑写在控制器里太多,导致控制器臃肿。 需要检查MVC的历史背景,说明它最初来自Smalltalk,后来被广泛应用。可能提到不同框架MVC的实现差异,比如ASP.NET MVC和Ruby on Rails的不同处理方式。还要强调分层的好处,比如分离关注点,便于维护和测试。 另外,用户可能对MVC的每个组件具体负责什么不太清楚,比如模型是否处理数据验证,视图是否只是模板渲染,控制器如何协调模型和视图。需要明确每个部分的职责,并举例说明,比如用户注册流程中,控制器接收请求,调用模型处理数据,返回结果给视图展示。 最后,总结MVC的优缺点,帮助用户判断何时使用MVC,或者是否适合他们的项目。可能还要提到现代框架中的变种,比如MVP、MVVM,但重点还是MVC本身。确保回答结构清晰,分点说明,使用用户容易理解的语言,避免过于技术化的术语,必要时用代码示例或图表辅助说明。</think>以下是关于MVC框架的详细介绍,以分层逻辑呈现核心要点: --- ### 一、MVC本质解析 **设计目标**:分离业务逻辑、数据操作与界面呈现,实现**高内聚低耦合**的代码结构 **起源**:1978年由Trygve Reenskaug在Smalltalk-76中首次提出,最初用于GUI开发 **核心三要素**: 1. **Model(模型)**:数据管理层 - 职责:数据库操作、数据验证、业务规则 - 示例:用户注册时检查邮箱格式`validateEmail(email)` 2. **View(视图)**:界面呈现层 - 职责:数据可视化、用户交互界面 - 技术实现:HTML模板引擎(如Thymeleaf)、JSON响应生成 3. **Controller(控制器)**:逻辑协调层 - 职责:接收请求、调用Model处理、返回View渲染结果 - 典型代码: ```java @PostMapping("/login") public String login(User user) { if (userService.authenticate(user)) { return "dashboard"; // 视图名称 } return "login_failed"; } ``` --- ### 二、MVC工作流程(以Web请求为例) 1. 用户点击登录按钮 → 浏览器发送`POST /login`请求 2. **控制器**接收请求参数,调用**模型**进行认证 3. **模型**查询数据库,返回认证结果(成功/失败) 4. **控制器**根据结果选择对应**视图** 5. **视图**渲染HTML页面返回给用户 ![MVC流程图](https://via.placeholder.com/600x200?text=Request→Controller→Model→View→Response) (图示:请求在MVC各层间的传递路径) --- ### 三、经典框架实现对比 | 框架 | Model实现特点 | View技术栈 | Controller特性 | |--------------|-------------------------------|----------------------|-----------------------------| | Spring MVC | 基于POJO,配合JPA/Hibernate | JSP/Thymeleaf | `@Controller`注解路由 | | Ruby on Rails| ActiveRecord模式 | ERB/HAML | 约定优于配置的RESTful路由 | | Django | ORM内置模型类 | Django Templates | 基于函数的视图或类视图 | --- ### 四、MVC优势与痛点 #### ▨ 核心优势 - **可维护性**:修改界面无需改动业务逻辑(如更换前端框架) - **可测试性**:模型层可独立进行单元测试(如JUnit测试数据验证) - **团队协作**:前端/后端开发者可并行工作(通过接口契约) #### ▨ 常见误用场景 1. **Fat Controller**(控制器臃肿) ```java // 错误示例:将业务逻辑写在控制器 public void processOrder() { // 验证数据 → 计算价格 → 库存检查 → 全部写在控制器方法内 } ``` **修正方案**:将业务逻辑抽离到Service层 2. **View直接操作数据库** ```php <!-- 错误示例:在视图中执行SQL查询 --> <div> <?php $conn = new mysqli(...); $result = $conn->query("SELECT * FROM products"); ?> </div> ``` --- ### 五、MVC演进与变体 1. **MVVM**(Model-View-ViewModel) - 新增ViewModel层实现**向数据绑定** - 典型应用:Vue.js(`v-model`指令)、Android DataBinding 2. **MVP**(Model-View-Presenter) - Presenter完全取代Controller,承担更多逻辑 - 常见于桌面应用(如Java Swing开发) 3. **MVC与三层架构的关系** - 表示层(View+Controller) - 业务逻辑层(Model中的Service) - 数据访问层(Model中的DAO) --- ### 六、学习实践建议 1. **入门项目**:用MVC实现TODO列表应用(包含增删改查完整流程) 2. **调试技巧**: - 在控制器方法中添加日志输出,观察请求处理链路 - 使用Postman测试模型层接口(绕过视图直接验证业务逻辑) 3. **进阶方向**: - 研究框架源码(如Spring MVC的`DispatcherServlet`实现) - 对比不同语言的MVC实现差异(如ASP.NET MVC vs Laravel) --- 通过理解MVC的分层思想,开发者能更好地构建可扩展的应用程序。现代框架如React/Vue虽未严格遵循经典MVC,但其单向数据流设计仍可见MVC思想的延续。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值