flash 设计记录:命令队列
???????????? 这段时间没有怎么写过一些自己的练习代码,今天记录一下。最近想将一些设计方面的记录一下,以便在写代码的时候会有一个参考,方便自己使用。 今天练习一个简单的东西,其实具体来讲应该是一个设计模式,只是这个模式并不是用到很纯熟,但是这个玩意真得值得去探讨一番。 命令模式就不多说,应该是讲命令队列的执行。这种玩 法很新意。只要懂得执行一个队列就大概明白这种设计。我使用的代码是john 的代码,是外国人写的,加了少少改动。 ????????? ??????????? 在flash 语言设计队列当中,有一个写法经常这样做?? 如: start()? stop() next().. ..使用这些方法去执行一个队列当中内容,可以控制队列执行。同样命令队列也是一样,我们希望队列是按顺序执行,当执行完毕一个,下一个就跟着执行。这种做法很常见,也是比较常用的一种设计手法。 ? ?????????? 基本上操作:创建一个数组,这个数组装载队列内容,当开始的时候执行start()的方法,当完成这个内容,再执行next()的方法,并且每次shift一次 数组当中的内容 ,以减少这个数组的内容,直到执行完毕为止。 ????????????? var array:Array=[ ]; ????????????? array.push(内容A); ???????????? array.push(内容B); ?????????? ........................... ????????? if(执行完第一个内容) ???? ? { ?????????? ?next():?????????? ?????? } ? ?????????? 好,闲话少说。 和一般命令模式一样,大部分都喜欢定义一个接口ICommand。这个接口只有一个方法---execute(),利用这个方法,我们将我们要执行的行为在这里添加 ????? package { public interface ICommand { function execute():void; } }
????????? 这个接口,继承ICommand ,同样增加一个回调函数的执行方法,和一个完成这个命令的标记方法。 package { public interface IAsyncCommand extends ICommand { function addCompleteCallBack(callBack:Function):void; function complete():void; } }
package { public class AsyncCommand implements IAsyncCommand { private var callBack:Function; public function AsyncCommand() { } public function execute():void { } public function addCompleteCallBack(callBack:Function):void { this.callBack = callBack; } public function complete():void { this.callBack.call(); } } }
? package { public class CommandListManager { private var commadList:Array=[];//命令队列 private var isBusy:Boolean=false; public function CommandListManager() { } //添加命令列表 public function addCommandList(...args):void { for(var i:int=0;i<args.length;i++) { args[i].addCompleteCallBack(executeNext); commadList.push(args[i]); } } //执行命令 public function start():void { if(!isBusy) { executeNext(); } } //执行下一步 private function executeNext():void { isBusy=false; if(commadList.length>0) { isBusy=true; var command:IAsyncCommand=commadList.shift() as IAsyncCommand; command.execute(); } } } }
例子: ? package { import flash.display.Sprite; import flash.events.*; public class Test extends Sprite { private var command:CommandListManager; private var sprite:Sprite; public function Test() { init(); } private function init():void { sprite=creatSprite();//创建图形 command=new CommandListManager(); command.addCommandList(new HelloCommand(),new TraceCommand(sprite),new FilterCommand(sprite) ); command.start(); } private function creatSprite():Sprite { var sprite:Sprite=new Sprite(); sprite.graphics.beginFill(0xff0000); sprite.graphics.drawRect(0,15,15); sprite.graphics.endFill(); addChild(sprite); return sprite; } } } ? ?剩下的事情,我们添加我们想执行的命令,把我们需要执行的命令在execute() 里面写。 ? package { public class HelloCommand extends AsyncCommand { public function HelloCommand() { } override public function execute():void { trace("执行了第一个命令"); this.complete(); } } }
package { import flash.display.Sprite; import com.greensock.TweenLite; import flash.events.Event; public class TraceCommand extends AsyncCommand { private var obj:Sprite; public function TraceCommand(obj:Sprite) { this.obj=obj; } override public function execute():void { trace("执行了第二个命令"); TweenLite.to(this.obj,0.5,{x:50,y:60,onComplete:onCompleteHandler}); } private function onCompleteHandler():void { this.complete(); } } }
package { import flash.display.Sprite; import flash.events.Event; import flash.filters.GlowFilter; public class FilterCommand extends AsyncCommand { private var obj:Sprite; public function FilterCommand(obj:Sprite) { this.obj=obj; } override public function execute():void { trace("执行了第三个命令"); this.obj.filters=[new GlowFilter(0x00ff00)]; this.complete(); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |