2010-01-19 53 views
1

好吧,我正在寫一個開源庫。該庫的一部分涉及在二維和三維空間中移動實體,以便具有操縱旋轉,位置等的功能。庫設計窘境

現在理想情況下,我希望我的圖書館能夠與其他圖書館合作,尤其是像Papervision3D和其他Flash 3D引擎,但不會忘記Sprite或Movieclip等基本圖像對象。

所以這是我的窘境。將操縱實體的函數也需要修改底層模型數據的值(因此無論是Sprite,Papervision對象等)。使我的庫靈活以便它可以支持多種數據模型的最佳方法是什麼?性能也是重要方面。

目前我想到的是這樣的:

//this is the public function that I expose in my library 
    public function rotate(val:Number,func:Function,objData:*):void 
    { 
func(val,objData); 
    } 

    //example of a function that could be passed in 
    //this one will rotate a MovieClip 
    private function modelFunction1(rot:Number,objData:*):void 
    { 
var myMov:MovieClip = objData as MovieClip; 
myMov.rotation = rot; 
    } 

    //second example of a function that could be pass in 
    //this one will rotate a point 
    private function modelFunction2(rot:Number,objData:*):void 
    { 
    //yes I know this piece of code makes no sense :P 
    var p:Point = objData as Point; 
    p.x = Math.cos(rot); 
    p.y = Math.sin(rot); 
    } 

這樣的話它可以用來像:

rotate(4,modelFunction2,myPoint) 

//or 

rotate(4,modelFunction1,mySprite); 

我要補充一點,在現實中我作爲客戶端代碼,深得無法直接調用旋轉功能。相反,我想要傳入的旋轉函數需要作爲類成員存儲在某處,然後由rotate函數調用。它只是更少的代碼讓我像上面那樣寫出來。

這對我來說看起來很靈活,雖然鑄造和傳遞函數的性能影響涉及到我(但可能沒問題)。任何人都可以提出一個替代方案,或者我有最合理的解決方案。謝謝:)

回答

2

我建議適配器模式。

在你的情況下,你可以定義接口,爲你的庫所期望的而不是函數參數提供類型安全的定義。 然後您需要編寫實現您的librarys接口的適配器類,幷包裝例如papervision對象,並將對接口方法的函數調用委託給papervision對象。

interface IRotatatable { 
    function rotate(deg : Number) : void 
} 

class YourLibraryClass { 

    public function rotate(r : IRotatatable, val : Number):void { 
     r.rotate(val) 
    } 
} 


class P3DAdapter implements IRotatable { 
    public function P3DAdapter(p3d : SomePaperVisionObject) { 
     _p3d = p3d; 
    } 

    public function rotate(r :Number):void { 
     p3d.rot = r; 
    } 
} 


function someClientCode():void { 
    var adapter : IRotatable = new P3DAdapter(p3d) 
    new SomeLibraryClass().rotate(adapter, val)); 
} 
+0

這正是我所追求的。謝謝 :) – Allan 2010-01-19 23:22:50