双mvc框架
2015-11-11 10:15
302 查看
双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]
AppExtBase 中的派发消息接口
AppExtBase 中注册和移除 控制器、模型接口
AppExtBase 中注册和移除 视图接口
ControllerBase
ViewBase
ModelBase的get和set接口,有只读属性才使用它,因为这个是方便写应用的(组件式的写法要用到),要明了的声明类实例的属性也可以用它([\10/]明了的声明类实例的属性)
[/10]
[/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的兼容接口重构是不适用的。
[/code]
[\16,17/+=2]笔记16、17是注册回调的代码,回调只能注册,不能删除,这样回调就像直接调用的形式;回调需要定义全局事件名;如果想用能删除的形式,请用事件。
[/18+=2]最后,那个ModelBase基本没用(只读属性在尾部加”_”,自己写get方法),要么留一个空ModelBase类,要么就不继承直接写Model类。
[\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]
AppExtBase 中的派发消息接口
AppExtBase 中注册和移除 控制器、模型接口
AppExtBase 中注册和移除 视图接口
ControllerBase
ViewBase
ModelBase的get和set接口,有只读属性才使用它,因为这个是方便写应用的(组件式的写法要用到),要明了的声明类实例的属性也可以用它([\10/]明了的声明类实例的属性)
[/10]
[/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的兼容接口重构是不适用的。
[\11/+/16\+正常运行]
//>>>>>>>>>>>>>
--
-- Author: xiaowa
-- Date: 2015-10-17 07:53:29
--
--框架回调对象
local CallBack = CallBack or class("CallBack")
local call_hash_ = call_hash_ or app.util.HashMap.new()
--e_name 注册回调的事件名
function CallBack:ctor(e_name)
self.e_name_ = e_name
call_hash_:setElement(e_name,self)
end
function CallBack:call(...)
local n = table.getn(self)
for i=1,n do
self[i](…)
end
end
function CallBack:register_call(fun)
table.insert(self,fun)
end
function CallBack.register(e_name,fun)
local callback = call_hash_:getValue(e_name)
callback:register_call(fun)
end
return CallBack
//<<<<<<<<<<<<
[/17\+正常运行]
//>>>>>>>>>>>>>>>>>>
function LoginCtrl:ctor()
…
…
--测试回调对象
self.print_ = app.compose.CallBack.new(TEST_CALLBACK)
end
function LoginCtrl:enterLoginScene()
self.login_view_:open()
self.print_:call("this is callback on LoginCtrl")
end
TEST_CALLBACK = "test_callback"
function LoginView:open()
display.replaceScene(self.scene_)
local num = 1
local function fun1(str)
printLog("xiaowa",str.." in "..num)
num = num+1
end
local function fun2(str)
printLog("xiaowa",str.." in "..num)
num = num+1
end
app.myApp:register(TEST_CALLBACK,fun1)
app.myApp:register(TEST_CALLBACK,fun2)
end
//<<<<<<<<<<<<<<<<<
[/code]
[\16,17/+=2]笔记16、17是注册回调的代码,回调只能注册,不能删除,这样回调就像直接调用的形式;回调需要定义全局事件名;如果想用能删除的形式,请用事件。
[/18+=2]最后,那个ModelBase基本没用(只读属性在尾部加”_”,自己写get方法),要么留一个空ModelBase类,要么就不继承直接写Model类。
相关文章推荐
- usaco.setion1.3.skidesign(枚举)
- onclick="return checkForm()" 、onclick="checkForm();return false;"解析 与 return false;
- vector中删除第k个元素的巧妙方法
- IntelliJ IDEA导入项目部署导致磁盘被占满
- cassandra 学习之旅<一> 初体验
- OSG播放fbx动画
- MySQL utf-8 插入中文出错 解决办法
- Snoopy+phpquery采集demo
- 10.2 菜单
- .bash_profile和.bashrc的什么区别
- MySQL创建和删除数据库的命令及相关PHP脚本的操作方法
- oracle处理乱码的问题
- Activemq的Queue发送和接收的例子
- Masonry介绍与使用实践:快速上手Autolayout
- shareData
- 如何防止应用因获取IDFA被AppStore拒绝
- NET程序的代码混淆、加壳与脱壳
- 微信支付-扫码支付-原生支付-统一下单-参数说明
- 基于HTML5树组件延迟加载技术实现
- 前后台传中文乱码问题改成UTF-8