2010-01-19 50 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