好文档 - 专业文书写作范文服务资料分享网站

基于PureMVC的一个FlexMP3播放器分析报告

天下 分享 时间: 加入收藏 我要投稿 点赞

26 public function startup(app:Object):void 27 {

28 sendNotification( STARTUP, app ); 29 } 30

31 /**

32 * Register Commands with the Controller 33 */

34 override protected function initializeController( ) : void 35 {

36 super.initializeController(); 37 registerCommand( STARTUP, StartupCommand ); 38 } 39 40 } 41 }

这里分析一下,在ApplicationFacade类里,我们定义了一个String的常量,这个只是一个消息的类型,跟Flex里的Event的常量一样的,注意,规化一点的话,应该将消息类型的字符串都定义为常量,而我在后面的代码中为了省事就直接用“XXXXX”这样的字串代替了,还是建义写成静态常量。

我们看到了startup()的代码了,就是在刚才主程序里调用的那个函数,这里接收了一个主程序的引用。

我们还看到了有一个initializeController( ) 的函数,当这个ApplicationFacade被实例化加载的时候,会先自动调用initializeController( ) 这个函数,所以,我们应当在

ApplicationFacade在被初始化的时候,就对Command进行注册,说就是注册,其实也只是将一个Command与一个消息绑定在一起而已。当发送该消息时,Facade就会自动的找到那个Command并实例化执行。

registerCommand( STARTUP, StartupCommand );这句就是对Command进行注册的代码,

registerCommand都是父类或接口里面定义的方法,我们先不用管它,STARTUP就是上面定义的一个常量,表示一个消息的类型,StartupCommand这个类就是我定义的一个Command类,这里说白了就是STARTUP这个字符串常量就是一个Key,而StartupCommand就是一个Value,存放在一个数组里面,当有人发送一个STARTUP的消息时,程序就自动生成一个StartupCommand来处理。

我们再看看startup()这个方法,在刚才的主程序里调用这个方法时,传入了一个传入了一个参数this,就是主程序本身,在startup()方法里面,发送了一个消息 sendNotification( STARTUP, app ); sendNotification()这个是发送消息的方法,第一个参数是消息的类型,第二个是可选参数,是消息的容(消息体),在这里,将主程序的引用作为消息体绑在消息里一起发送了。由于之前在初始化的时候将STARTUP消息类型与StartupCommand绑定在一起了,所以当发送这个消息的时候,StartupCommand将会被通知,所以这时候,程序的流程就跳入到StartupCommand类里面。下面我们来看StartupCommand类的容:

1 package .jiangzone.flex.pureplayer.controller 2 {

3 import org.puremvc.as3.interfaces.ICommand; 4 //这里略去一些import代码

5 import .jiangzone.flex.pureplayer.model.PlayListProxy; 6

7 public class StartupCommand extends SimpleCommand implements ICommand 8 {

9 override public function execute( note:INotification ) : void 10 { 11 /**

12 * 获取消息体容,在发送STARTUP消息时,将主程序PurePlayer作为消息体跟随消息传送 13 */

14 var app:PurePlayer = note.getBody() as PurePlayer; 15 16 /**

17 * 注册代理(Model) 18 */

19 facade.registerProxy(new SongProxy()); 20 facade.registerProxy(new PlayListProxy()); 21 /**

22 * 注册ViewComponents或者UI组件的中介器。 23 */

24 facade.registerMediator(new ControlBoardMediator(app.controlBoard)); 25 facade.registerMediator( new SongListBoardMediator(app.songListBoard));

26 facade.registerMediator(new ProgressBoardMediator(app.progressBoard));

27

28 (facade.retrieveProxy(PlayListProxy.NAME) as PlayListProxy).loadPlayList(); 29 } 30 } 31 }

上面的就是一个Command的代码,注意,一个Command必需要实现ICommand接口,而如果是一个单Command的话,就需要继承SimpleCommand类,而如果是一个Command链的话,就需要实现MacroCommand,至于Command链,如果有J2EE基础的话,也就是Filter的过滤器链差不多。这里不多说。大家可以看看PureMVC的官方文档与API!

在Command里,都需要覆盖execute 这个方法,这个方法就是执行你的逻辑代码的地方,由Facade自动调用,当这个Command所绑定的消息被发送时,Facade就会创建一个Command实例并调用execute方法,方法里还传入一个INotification参数,就是你所发送的那个消息,里面包含了消息类型名称与消息体。在这个Command里,我没有处理什么,因为这个Command用于启动程序框架的,所以只在这里初始化了一些程序需要用到的资源,如注册代理与注册中介器,我们可以看到,注册代理与注册中介器的方法与注册Command的方法不同,注册Command的话,需要一个

消息名称与一个Command类绑定,而代理与中介器的注册就不需要与消息绑定,直接将代理与中介器实例化之后进行注册就可以了。这是由于Command的生产控制不是由用户来操作的,是由Facade里面的一个工厂方法来对Command实例化并管理的,所以需要与一个消息名称进行绑定,而代理与中介器就是用户管理的,通常一个代理就对应一个数据结构,如果有几个数据结构都比较简单,就可以在一个Proxy里管理,而同理,中介器也一样,一个中介器对一个Flex组件,但为一个Button建立一个中介器未名太浪费了,所以我这里都是将MP3分成三个部分,控制按钮部分,歌曲列表部分,播放进度部分,三个部分用三个中介器。通常这些中介器或者Proxy创建一次就可以了,Facade会将它它存放在数组中,当需要用到时,再由Facade来获取他们,所以,在注册代理与中介的时候,先实例化它们再注册!因为Command是短生命周期,而Proxy与Mediator是长生命周期,所以这里与Command有点区别。在实例化中介器的时候,我传入一个app.controlBoard的值:

new ControlBoardMediator(app.controlBoard),就是说,我这个中介器是对应app.controlBoard这个控件,app就是主程序。

当所有需要的资源都注册好后,我执行了下面一句代码:

(facade.retrieveProxy(PlayListProxy.NAME) as PlayListProxy).loadPlayList(); 之前讲到,注册代理时,将代理的实例进行注册,实际上就只是在Facade里将这个代理实例放进数组里而已,所以用facade.retrieveProxy()这个方法可以再次获得那个实例的引用,再调用这个代理里的一个方法loadPlayList()来进行加载播放列表。上上上面已经说过,因为Proxy是只可以发信息,不可以收信息,所以你叫Proxy工作的话,只好得到它的引用再调用它的方法来控件它的工作。注意,在Facade重新获得代理的方法里

facade.retrieveProxy(PlayListProxy.NAME) as PlayListProxy 你需要指定一个字符串来获取某一个代理,在编写每一个代理时,都要为它指定一个name的字符串,而且是代理的唯一标识!这个时候,程序的流程就会跳到代理里运行loadPlayList()这个方法。下面,我们来看看PlayListProxy的代码:

1 package .jiangzone.flex.pureplayer.model 2 {

3 import org.puremvc.as3.interfaces.IProxy; 4 //省略import代码 5 import flash.xml.XMLNode;

6

7 public class PlayListProxy extends Proxy implements IProxy 8 {

9 //定义一个代理的名字,唯一的标识

10 public static const NAME:String = 'PlayListProxy'; 11 //定义一个HttpService,用于获取远程的数据 12 private var hs:HTTPService; 13

14 public function PlayListProxy():void{ 15 super(NAME,new Array()); 16 hs = new HTTPService();

17 hs.addEventListener(ResultEvent.RESULT,onResult); 18 hs.addEventListener(FaultEvent.FAULT,onFault); 19 } 20

21 public function get playList():Array{ 22 return data as Array; 23 } 24

25 public function loadPlayList(url:String = 'jiang/pureplayer/data/playlist.xml'):void{

26 hs.method = \27 hs.resultFormat = \

28 hs.url = url + '?ranid=' + (new Date()).time; 29 hs.send(); 30 } 31

32 private function onFault(e:FaultEvent):void{ 33

34 }

基于PureMVC的一个FlexMP3播放器分析报告

26publicfunctionstartup(app:Object):void27{28sendNotification(STARTUP,app);29}3031/**32*Register
推荐度:
点击下载文档文档为doc格式
94upi7i5m23bj0w6iip07zlrl1bkfq0130g
领取福利

微信扫码领取福利

微信扫码分享