Re: [問題] 外部載入的 loader API 設計

看板Flash作者 (不知...)時間15年前 (2010/07/16 23:55), 編輯推噓1(103)
留言4則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《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
我有一個介面叫 IPlayer 是以 PlayList 為容器
07/17 00:33, 2F

07/17 00:34, , 3F
而 PlayList 也實作 IPlayer
07/17 00:34, 3F

07/17 00:34, , 4F
那麼狀態就是指 IPlayer 所支援的方法
07/17 00:34, 4F
文章代碼(AID): #1CG83bYZ (Flash)
文章代碼(AID): #1CG83bYZ (Flash)