加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flash 设计记录:命令队列

发布时间:2020-12-15 06:52:12 所属栏目:百科 来源:网络整理
导读:???????????? 这段时间没有怎么写过一些自己的练习代码,今天记录一下。最近想将一些设计方面的记录一下,以便在写代码的时候会有一个参考,方便自己使用。 今天练习一个简单的东西,其实具体来讲应该是一个设计模式,只是这个模式并不是用到很纯熟,但是这

???????????? 这段时间没有怎么写过一些自己的练习代码,今天记录一下。最近想将一些设计方面的记录一下,以便在写代码的时候会有一个参考,方便自己使用。 今天练习一个简单的东西,其实具体来讲应该是一个设计模式,只是这个模式并不是用到很纯熟,但是这个玩意真得值得去探讨一番。 命令模式就不多说,应该是讲命令队列的执行。这种玩 法很新意。只要懂得执行一个队列就大概明白这种设计。我使用的代码是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;
	}
}


通过一个类实现IAsyncCommand 基本接口,而execute()就是继承的方法当中重写的。

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();
		}
	}

}


命令队列的管理,这个方法设计得很有意思,当我们执行下一条命令的时候,使用的方法 是利用数组shift 方法调用他里面命令,然后执行里面行为。

?

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();
		}		 
	}	
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读