Re: [問題] 外部載入的 loader API 設計
※ 引述《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
推
07/17 00:32, , 1F
07/17 00:32, 1F
→
07/17 00:33, , 2F
07/17 00:33, 2F
→
07/17 00:34, , 3F
07/17 00:34, 3F
→
07/17 00:34, , 4F
07/17 00:34, 4F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):