好的,我正在编写一个开源库。该库的一部分涉及在二维和三维空间中移动实体,因此它将具有操纵旋转,位置等的功能。
理想情况下,我希望我的库可以与其他库一起使用,特别是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函数调用。它的代码就像我上面写的一样少。
这对我来说似乎很灵活,虽然演员和传递函数的性能影响关系到我(但可能没问题)。任何人都可以提出替代方案,或者是我最合乎逻辑的解决方案。谢谢:))
答案 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));
}