我一直在尝试阅读用于3D引擎开发的场景图的不同实现,以学习该域中使用的设计模式,但遗憾的是代码库对我来说太大了(但希望如此)。
所以,假设我们有一个类Model
,它存储指向几何,着色器,纹理等的指针。
我们希望分别允许每个成员的动画,比如GeometryAnimator
,TextureAnimator
等,但Model
当然也可以是静态的。
我看到的是策略模式(对于静态实体没有操作)和装饰器模式都可以用来实现这一点。这个应用程序中每个的好处/缺点是什么?或者我是否过于复杂?
感谢您的帮助!
答案 0 :(得分:2)
一个简单但非常完美的解决方案是为场景节点可以表示的所有各种事物建立接口/抽象基类。
class Texture
{
...
};
class Geometry
{
...
};
// etc
class SceneNode
{
public:
// The following return null by default but
// can be overriden by SceneNode subclasses
// to return interface pointers.
virtual Geometry* geometry()
{
return 0;
}
virtual Texture* texture()
{
return 0;
}
};
class Model: public SceneNode, public Texture, public Geometry
{
public:
// Override the functions of inherited interfaces
virtual Geometry* geometry()
{
return this;
}
virtual Texture* texture()
{
return this;
}
};
这实际上是高端3D软件包以某种形式采用的方法。有了它,给定任何场景节点,你可以查询它是否支持特定的界面(例如:纹理一个),然后通过它进行动画,例如。
Maya和XSI这样做但是使用一个接口方法能够返回所有返回void *的接口,客户端必须相应地转换它们。然后,他们创建隐藏所需的强制转换的引用类型。
您无需始终为所有编程解决方案采用经典设计模式。将它们视为工具和建议,但总是询问哪种设计模式适用于给定问题并不总能导致最直接的解决方案。你必须自己思考,但设计模式可以帮助你。
答案 1 :(得分:1)
Decorator模式通常用于无法修改的结构。策略模式可以在您完全控制的结构中使用,但也允许您允许其他人更改行为,而不必像装饰器一样“围绕”它。
答案 2 :(得分:0)
我认为你过于复杂。也许一个类(模型)就足够了?记住只封装不同的东西。
如果您认为这还不够,那么策略就可以了。例如,如果您想使用许多不同的 TextureAnimator类,并且能够在运行时切换它们。
Decorator模式就像子类化,但可以在运行时完成(并支持多重继承)。它也很慢(我想你正在编写一个游戏)。 IMO这不是一个解决方案。
在这种情况下,我会编写一个类。如果我将来需要策略,我会重构代码。