StarlingMVC简介,原理解说及示例源码
StarlingMVC简介
StarlingMVC是一个为使用Starling来开发游戏的MVC框架。这个框架的特性方面,很像Swiz和RobotLegs,原理亦像Mate。其特性列表如下:
- 依赖注入(DI)/控制反转(IOC)
- 视图代理(View Mediation)
- 事件捕获(Event Handling)
- 非侵入性框架
- 配置简单
- 容易扩展
- 包含了很多对您的游戏有帮助的工具
官网地址:http://creativebottle.github.com/starlingMVC/
在StarlingMVC中什么是依赖注入?
package com.mygame.controllers
{
public class GameController
{
[Inject]
public var gameModel:GameModel; public function GameController():void
{
}
}
}
开发者无须为gameModel赋值,可以直接使用gameModel(在构造器中不能使用),这便是依赖注入。gameModel的赋值操作是由框架自动完成的。
在StarlingMVC中什么是Bean?
Bean是StarlingMVC的核心成员。Bean代表的是开发者关心的对象,是已经添加Metadata标签需要被注入的,也可以是没有添加任何标签的单个对象,如Starling.current.juggler。如果在添加Bean时没有指定id,那么这个Bean将是单例的(它使用自身的Class作key)。
StarlingMVC的设计原理及标签说明
StarlingMVC是一个设计精巧,非常具有研究价值的开源类库。它的DI/IOC设计技巧非常值得AS程序员学习与研究。以下是sban对其原理的理解,不到之处请大师多多指教:
- StarlingMVC之所以可以实现依赖注入,是因为让开发者在类上自定义了Metadata标签。flash.utils.describeType方法可以获取类或对象的XML描述,StarlingMVC以此获知开发者的意图。StringMVC充许的Metadata标签是有限的,且每一个标签的名称及属性都有预先严格的定义。StarlingMVC在获取类的XML描述时使用了数据缓存,以减少开销。
- StarlingMVC要求开发者提供显式Beans,只有被提供的Bean才会被解析、注入及被其它Bean找到。通过事件在运行时也可以动态添加Bean,因为StarlingMVC在BeanFactory中在root与eventDispatcher上分别添加了addBean事件(在view内派发Bean事件需要bubble)。
- 每一个被解析的Bean,根据Metadata标签,分别交给不同的Processor去处理。StarlingMVC目前支持的Metadata标签有:
static public const DISPATCHER:String = "Dispatcher";
static public const EVENT_HANDLER:String = "EventHandler";
static public const JUGGLER:String = "Juggler";
static public const INJECT:String = "Inject";
static public const POST_CONSTRUCT:String = "PostConstruct";
static public const PRE_DESTROY:String = "PreDestroy";
static public const VIEW_ADDED:String = "ViewAdded";
static public const VIEW_REMOVED:String = "ViewRemoved";
static public const BINDINGS:String = "Bindings";
static public const EXECUTE:String = "Execute"; - [Dispatcher]标签用于注入StarlingMVC全局的eventDispatcher对象。无参数。被注入的变量,其名称无所谓。在标有该标签的变量上派发事件,将是全局事件,在另外一个地方,可以使用同样标有该标签的变量进行监听。
- [EventHandler]标签用于接收事件监听,支持属性data及Event的属性。StarlingMVC将在全局eventDispatcher与root上监听事件,如果有type派发,被标注标签的函数将被触发。函数的参数可以event,也可以是由event传递的数据(在标签属性列表中定义)。这是IOC(反转控制)的一个很好例子,通常添加事件监听需要有target,有handler,然后addEventListner,在这里不需要,只需要提供将要触发的函数及触发条件就可以了。这是IOC框架最迷人的功能之一。
- [Juggler]标签用于向变量注入Starling.juggler,无参数,被注入名称亦无所谓。使用这个标签,意味着开发者不用把Starling.juggler做为Bean添加进来,也可以拿它注入到变量中。其实对它的注入可有可无,因为开发者自己可以直接使用Starling.jugger。
- [PostConstruct]标签用于代替构造器,所有Bean均会得到执行。使用StarlingMVC,类的构造器便不方便使用了,因为有些被注入的变量在此时是访问不到的,可以使用[PostConstruct]标签标注另一个方法代替构造器。
- [PreDestroy]标签用于方法在对象销毁之前调用,用于释放资源。无参数。
- [ViewAdded]标签用于标注当某个视图被添加进显示列表之后执行的方法。可以添加到任何类里,推荐添加到ViewMediator类。被标注的方法必须有一个view:SomeViewClass的参数。StarlingMVC将拿view参数的类型与被添加的view的类型做比较,如果相同,方法才会被执行。这是StarlingMVC最精巧,同时也是开销最大的特征之一。
- [ViewRemoved]标签用法与[ViewAdded]类似。
- [Inject]标签用于将变量绑定到数据源,如果数据源对象不是全局的,即在添加Bean时指定了ID,那么在这里需指定一个source与id对应。[Inject]标签充许绑定到模型的变量上,例如:
[Inject(source="playerModel.score",bind="true",auto="false")]
被绑定者也可以是setter。当bind属性为true时,源对象数据更新时,这里亦会更新;当设置auto属性为false时,只有在数据更新并显式调用bindings.invalidate时,这里才会更新。
- [Bindings]标签用于注入StarlingMVC中的全局Bindings对象。Bindings对象用于维持所有被Inject的变量的同步,当源对象发生变化时,判断将它们更新过去。在StarlingMVC的设计中,Bindings实现了starling.animation.IAnimatable接口。
- [Execute]标签用于标注将会某特定事件触发执行的方法。可以有参数,参数的定义与[EventHandler]相同。StarlingMVC对[Execute]的解析并不是立即执行的。作者举例例如,在config StringMVC初期,开发者添加一个这样的bean:
new Command(DoSomethingEvent.DO_SOMETHING, DoSomethingCommand)
在DoSomethingCommand类中至少有一个方法被标注了[Execute]标签,当DoSomethingEvent.DO_SOMETHING事件派发时,这些方法将被执行。派发事件的对象可以是root或者是eventDispatcher。
资源与源码
StarlingMVC是一个小巧玲珑的框架,虽然目前它的功能还不是很丰富,但作为一个MVC框架已经相当成熟了。
源码是作者从国外某个站点上下载的,为了研究学习,做了些许改动(原带的StarlingMVC不能正常使用Inject的bind属性,已修改使用从官网下载的最新版本StarlingMVC 1.1),加了一点点注释。想研究的同学拿去了,版权归原作者所有。
StarlingMVC简介,原理解说及示例源码的更多相关文章
- 安卓图表引擎AChartEngine(三) - 示例源码折线图、饼图和柱状图
折线图: package org.achartengine.chartdemo.demo.chart; import java.util.ArrayList; import java.util.Lis ...
- 安卓图表引擎AChartEngine(二) - 示例源码概述和分析
首先看一下示例中类之间的关系: 1. ChartDemo这个类是整个应用程序的入口,运行之后的效果显示一个list. 2. IDemoChart接口,这个接口定义了三个方法, getName()返回值 ...
- 线程池底层原理详解与源码分析(补充部分---ScheduledThreadPoolExecutor类分析)
[1]前言 本篇幅是对 线程池底层原理详解与源码分析 的补充,默认你已经看完了上一篇对ThreadPoolExecutor类有了足够的了解. [2]ScheduledThreadPoolExecut ...
- Tyrion中文文档(含示例源码)
Tyrion是一个基于Python实现的支持多个WEB框架的Form表单验证组件,其完美的支持Tornado.Django.Flask.Bottle Web框架.Tyrion主要有两大重要动能: 表单 ...
- Asp.Net Web Api 2 实现多文件打包并下载文件示例源码_转
一篇关于Asp.Net Web Api下载文件的文章,之前我也写过类似的文章,请见:<ASP.NET(C#) Web Api通过文件流下载文件到本地实例>本文以这篇文章的基础,提供了Byt ...
- Visual Studio 2015开发Qt项目实战经验分享(附项目示例源码)
Visual Studio 2015开发Qt项目实战经验分享(附项目示例源码) 转 https://blog.csdn.net/lhl1124281072/article/details/800 ...
- Tyrion 中文文档(含示例源码)
原文出处: Mr.Seven Tyrion是一个基于Python实现的支持多个WEB框架的Form表单验证组件,其完美的支持Tornado.Django.Flask.Bottle Web框架.Ty ...
- 各类最新Asp .Net Core 项目和示例源码
1.网站地址:http://www.freeboygirl.com2.网站Asp .Net Core 资料http://www.freeboygirl.com/blog/tag/asp%20net%2 ...
- HashMap实现原理(jdk1.7),源码分析
HashMap实现原理(jdk1.7),源码分析 HashMap是一个用来存储Key-Value键值对的集合,每一个键值对都是一个Entry对象,这些Entry被以某种方式分散在一个数组中,这个数 ...
随机推荐
- Delphi RichEx 图像
unit RichEx; {2005-03-04 LiChengbinAdded:Insert bitmap or gif into RichEdit controls from source fil ...
- Delphi word 颜色
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, ...
- Long Dominoes(ZOJ 2563状压dp)
题意:n*m方格用1*3的方格填充(不能重叠)求有多少种填充方法 分析:先想状态,但想来想去就是觉得不能覆盖所有情况,隔了一天,看看题解,原来要用三进制 0 表示横着放或竖放的最后一行,1表示竖放的中 ...
- TestNG传参的几种方式
1. 通过parameter传参 java代码部分: import org.testng.annotations.Parameters; import org.testng.annotations.T ...
- 仿酷狗音乐播放器开发日志二十七 用ole为窗体增加文件拖动功能(附源码)
转载请说明原出处,谢谢~~ 中秋到了,出去玩了几天.今天把仿酷狗程序做了收尾,已经开发完成了,下一篇博客把完结的情况说一下.在这篇博客里说一下使用OLE为窗体增加文件拖拽的功能.使用播放器,我更喜欢直 ...
- python中的类型转换
函数 描述 int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 float(x ) 将x转换到一个浮点数 complex(real [,imag ...
- PhoneGap,Cordova[3.5.0-0.2.6]:利用插件Cordova-SQLitePlugin来操作SQLite数据库
在PhoneGap应用程序中,我们可以利用一款名叫Cordova-SQLitePlugin的插件来方便的操作基于浏览器内置数据库或独立的SQLite数据库文件,此插件的基本信息: 1.项目地址:htt ...
- 新購電腦筆記 - G1.Sniper B7 內建網路晶片在 Mint 17.2(Cinnamon)上無法使用(已解決)
又好久沒寫文章了,這次因新購電腦,有一些狀況,故做一下記錄,也分享給遇到同樣問題的格友 以前在公司裝 Ubuntu 從沒遇過這麼多問題,這次自己第一次組電腦,也第一次裝 Mint,問題倒是不少 第一個 ...
- C++多态分析(polymorphisn)
前言 借着这次学校的生产实习来回顾下C++的多态,这里讨论下C++的多态以及实现原理.我都是在QT下使用C++的,就直接在QT下进行演示了 多态介绍 面向对象语言中最核心的几个理念就是:封装.继承.多 ...
- MUSIC算法学习笔记
MUSIC即多重信号分类. MUSIC算法仅能估计非相干关信源,对相干信源,其性能将随信源间的相 关系数的增加而逐渐降低,直至完全恶化. 阵列信号处理的只要问题包括:波束形成技术,零点形成技术,空间谱 ...