作者Angelliya (不知...)
看板Flash
标题Re: [问题] 外部载入的 loader API 设计
时间Fri Jul 16 23:55:15 2010
※ 引述《etrexetrex (moonet)》之铭言:
: 在本篇讨论的外部载入资料没有限定型态
: 但本篇以影片为例,讨论外部载入与内部汇入资料的整合
: 一个外部载入的影片API可能是这样设计的
: 1.需要在建构式传入档案路径
: var f1:FLVLoader = new FLVLoader("档案路径");
: 或者用方法传入
: var f1:FLVLoader = new FLVLoader();
: f1.load("档案路径");
: 2.需要监听载入完毕的事件
: f1.addEventListener(Event.READY, readyHandler);
: function readyHandler(e:Event):void{
: f.play();
: }
: 但对於一个内部汇入的FLV来说应该是可以直接使用
: f2.play();
: 我的问题点在於如何设计一个API,可以整合外部载入与内部汇入的不同步性质
: 举例来说我想要控制动画流程,所以我作了一个 PlayList 类别
: 假设是这样使用的:
: var pl:PlayList = new PlayList();
: pl.add(f1);
: pl.add(f2);
: pl.play();
: 因为不能保证 f1 跟 f2 已经载入完毕,所以上面的写法在 play 时可能会出问题
: 那麽我可能就被迫改成用事件驱动的写法
: var pl:PlayList = new PlayList();
: pl.add(f1);
: pl.add(f2);
: pl.addEventListener(Event.READY, readyHandler2);
: function readyHandler2(e:Event):void{
: pl.play();
: }
: 但是如果这样写就会有些不方便的地方
: 因为可能f1 跟 f2 都是内部汇入
: 这样就有一种多此一举的感觉
: 但为了通用性,可能也就只有事件驱动的写法比较好了
: 我想请问的是有没有一个架构已经解决这种问题
看到这个问题的直觉想法是
用State Pattern来处理
以这个例子来说
要播放PlayList里的东西,
可是要播的东西可能是外部档,也可能是内部的档案
把PlayList当成介面
每个实践它的都必须实践一些方法
假设有STOP与PLAY两个状态
PlayList负责执行Stop();与Play();
但是这两个方法的是由实践的类别而定
假设是"Play"的情况
读取资料是内部档案时,不跑Loader直接播放
读取资料是外部档案时,则跑Loader,但是因为是Play的状态,
由类别自己决定在可播放的时候时候播放
(超过一定百分比或读取完毕)
这样就不用将就某一种情况,要写switch或if来处理了
只是每一个类别都要实践Stop、Play的方法
如果哪天要再加其他的状态(例如Pause),每个实践的类别就都需要更动了
----
参考自
ActionScript3.0 Design Patterns
Chapter10: State Pattern
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.32.165.26
1F:推 etrexetrex:谢谢你的回应 我的观点是合成模式 如果要讲成状态 07/17 00:32
2F:→ etrexetrex:我有一个介面叫 IPlayer 是以 PlayList 为容器 07/17 00:33
3F:→ etrexetrex:而 PlayList 也实作 IPlayer 07/17 00:34
4F:→ etrexetrex:那麽状态就是指 IPlayer 所支援的方法 07/17 00:34