新框架

组件的绑定

在stage的方法里面会出现像self:fixbanker(rule)这样的函数调用,但是在该类和父类里面都找不到显示的定义fixbanker这个方法的地方,原因是设计了一个组件绑定的机制。

总的来说就是,就是stage和Behavior各自用对方的引用,由于Behavior有统一个接口bind()等,stage会继承到父类的bindMethod()方法,过程很绕,拿对方的引用传入自己的方法(字段)作为参数来调用对方暴露的接口,让对方也拥有自己的方法,以便对方调用。有点像一个设计模式,我忘了是哪个了,策略模式还是哪个来着?

拿DingZhuangStage做来说,

继承关系:DingZhuangStage.lua--->GameStage.lua--->TGameObject.lua--->GameObject.lua

在TGameObject.lua的ctor中会调用initBehaviors(),根据GameConfig里面的配置来找到当前stage配置的是哪个behavior,比如DingZhuangStage对应的FixBankerBehavior

--GameConfig.lua

local behaviorConfig = {};
behaviorConfig.LogicManager = {"DealCardBehavior",}
behaviorConfig.PlayCardStage = {
    "GameRoundBehavior","GrapCardBehavior","OperationBehavior","DumpHandCardBehavior",
}

behaviorConfig.DingZhuangStage = {"FixBankerBehavior"}
--TGameObejct.lua
function TGameObject:ctor( tableDB )
    if tableDB then
        self.m_tableDB = tableDB;
        self:bindBehavior("LogBehavior");
        self:bindBehavior("DAOBehavior");
        self:initBehaviors(tableDB:queryBehavior(self.className__));
    end

    self:initBehaviors(BehaviorFactory.behaviorConfig[self.className__]);
end

function TGameObject:initBehaviors( behaviors )
    if behaviors then
        for _,v in ipairs(behaviors) do
            self:bindBehavior(v);
        end
    end
end

有可能绑定多个behavior,所以在initBehavior()中遍历绑定所有Behavior。bindBehavior中,递归的绑定Behavior的依赖。

function TGameObject:bindBehavior( behaviorName )
    ---检查是否已经绑定该行为
    if not self.behaviorObjects_ then self.behaviorObjects_ = {} end
    if self.behaviorObjects_[behaviorName] then return end

    ---根据配置表创建行为
    local behavior = BehaviorFactory.createBehavior(behaviorName, self.m_tableDB)

    ---获取行为依赖
    for i, dependBehaviorName in pairs(behavior:getDepends()) do
        --绑定依赖行为
        self:bindBehavior(dependBehaviorName)

        ---以依赖行为名为key,以需要此依赖的行为名做list,记录下来
        if not self.behaviorDepends_ then
            self.behaviorDepends_ = {}
        end
        if not self.behaviorDepends_[dependBehaviorName] then
            self.behaviorDepends_[dependBehaviorName] = {}
        end
        table.insert(self.behaviorDepends_[dependBehaviorName], behaviorName)
    end

    ---将行为上的方法绑定至此object类上
    behavior:bind(self)
    ---以行为名为key,行为的操作对像为vaule记录下来
    self.behaviorObjects_[behaviorName] = behavior
    ---按优先级重置行为
    self:resetAllBehaviors()
end

具体的绑定就在behavior:bind(self)这句。每个Behavior都会有bind()这个方法,用这个方法来将stage和他配置的Behavior绑定起来。

function FixBankerBehavior:bind(object)
    for i,v in ipairs(exportInterface) do
        object:bindMethod(self, v, handler(self, self[v]));
    end
end

Behavior的bind()方法会调用传进来的stage中的bindMethod()方法,在bindMethod方法中,就在当前stage中加入了Behavior中提供给stage中使用的方法。实现了绑定。

function GameObject:bindMethod(behavior, methodName, method, deprecatedOriginMethod, callOriginMethodLast)
    --取出之前的方法
    local originMethod = self[methodName]
    if not originMethod then
        self[methodName] = method
        return
    end
    .....
    .....
end
时间: 2024-10-05 13:23:52

新框架的相关文章

放弃OT了,找了个新框架ThinkCMF

放弃OT了,找了个新框架ThinkCMF,感觉还不错,用用看. 选择OT的原因: 1. OT基于ThinkPHP 2. OT对ThinkPHP进行了封装,使得开发应用更加简单 3. yershop应用是基于OT的 放弃的原因: 1. OT已经长时间没人维护了 2. OT提供的版本包问题太多,不适合使用. 接下来几天研究下ThinkCMF,希望有所进展.

Android4.3引入的UiAutomation新框架官方简介

译者序:Google在Android 4.3发布时提供了一套新的UiAutomation框架来支持用户界面自动化测试,该框架通过运用已有的Accessibility APIs来模拟用户跟设备用户界面的交互:比如获取窗口界面控件和注入事件等.如在4.3之前UiAutomator工具是通过InputManager或者更早的WindowManager来注入KeyEvent等,4.3之后用的就是新框架UiAutomation使用的Accessibility APIs来注入事件了. Class Overv

ReactiveCocoa - iOS开发的新框架

本文转载至 http://www.infoq.com/cn/articles/reactivecocoa-ios-new-develop-framework ReactiveCocoa(其简称为RAC)是由Github 开源的一个应用于iOS和OS X开发的新框架.RAC具有函数式编程和响应式编程的特性.它主要吸取了.Net的 Reactive Extensions的设计和实现.本文将详细介绍该框架试图解决什么问题,以及其用法与特点. ReactiveCocoa试图解决什么问题 经过一段时间的研

OpenWRT新框架的boot过程

昨天在分析procd如何工作的时候,有找到过下面这样一段描述新架构boot过程的文字: 1) Bootloader (uboot, redboot, adam2, grub, …) 2) Linux kernel starts, tries to find the mtd partition called “rootfs”, mounts it 3) Linux executes /etc/preinit 4) Preinit waits a few seconds for failsafe t

[转] iOS --- ReactiveCocoa - iOS开发的新框架

转载唐巧的博客:ReactiveCocoa - iOS开发的新框架

单片机新框架修改

前阵子做的单片机项目要使用新框架,不允许使用状态机,真是哔了狗了,很多代码要改,最终确定的方案是收到256后,找头找尾,有就处理,没有就往前移128,再读128个字符出来,相较之前的状态机处理效率,显然会下降,但是领导要求如此,那也没辙,同时也优化了数据处理的相关流程,学会了使用memmove,新的机制是,串口接收超时或者接收缓冲区半满或者全满时会置位,主程序中不断查询这个位. 串口1与GPS通信的代码改为如下 void UART1_DATA_PROC(void) { char *pS=NULL

OpenWRT新框架的flash layout

唔,新框架下,同时支持了一个只读的文件系统(SquashFS)和一个可读写的文件系统(jffs2).所以,这些是怎么处理的,需要进一步了解. 关于flash 在大多数嵌入式系统中,flash是其主要的程序和data的存储空间.因为flash的速度原因,在系统运行时,这些程序和data还要再被搬移到RAM中去,运行时,CPU事实上是从RAM中取程序和data.著名的uboot就是专门负责把操作系统搬移到RAM中去的,至于存储在文件系统中的data和其他程序,则是由操作系统负责去加载. 根据其内部结

新框架的选择

一个新框架的选择之路:     一.考虑前后端的交互方式的实现及兼容性,ajax的实现. 二.考虑UI框架的实用性 三.考虑开发.部署方式.这个很重要 四.易维护. 五.less.sass的支持. 软件的开发 一.前后端的设计登录信息的记录方式,交互方式 二.安全性 三.成本比较低,项目容易维护. 原文地址:https://www.cnblogs.com/yiyi17/p/8604377.html

iOS开发高级分享 - iOS 13 中的新框架 — MetriKit

MetriKit是iOS 13中用于收集和处理电池和性能指标的新框架.这是在WWDC今年与XCTestMetrics和Xcode Metrics组织者一起,作为一项协调一致的努力的一部分,为开发人员带来关于他们的应用程序在该领域的表现的新见解. 苹果会自动从AppStore上安装的应用程序中收集度量指标.您可以在Xcode 11中通过打开组织者(? ? ? o)并选择新的Metrics选项卡. MetriKit是Xcode组织者度量的补充,它提供了一种编程方式来接收有关应用程序在该领域中的表现的

新框架使用

等几年,再用新框架 在技??术领域,每个月都有一个新框架.例如,iOS 就有一个新的 UI 框架 SwiftUI. 我的建议是,等待几年再去学习它.不要担心会错过机会,这不是飞机航班,你仍然随时可以登机.任何时候,你都不应该因为害怕落后于潮流,而做出决定技术决定.如果你学习一个 UI 框架,它就应该对你的业务带来帮助,而不是为了学而学. 来自阮一峰日志摘录 文章来源:刘俊涛的博客 欢迎关注公众号.留言.评论,一起学习. ______________________________________