图书馆设计困境

时间:2010-01-19 12:55:09

标签: actionscript-3 open-source

好的,我正在编写一个开源库。该库的一部分涉及在二维和三维空间中移动实体,因此它将具有操纵旋转,位置等的功能。

理想情况下,我希望我的库可以与其他库一起使用,特别是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函数。相反,我想传入的旋转函数需要作为类成员存储在某处,然后由rotate函数调用。它的代码就像我上面写的一样少。

这对我来说似乎很灵活,虽然演员和传递函数的性能影响关系到我(但可能没问题)。任何人都可以提出替代方案,或者是我最合乎逻辑的解决方案。谢谢:))

1 个答案:

答案 0 :(得分: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));
}