2010-06-25 53 views
2

我一直在尝试通过不同的场景图形来实现3D引擎开发,学习这个领域使用的设计模式,但不幸的是,代码库对我来说太大了掌握(但希望)。装饰与战略模式(vs?)扩展功能

那么,假设我们有一个类Model存储指针给几何,着色,纹理等 ,我们希望让每个成员的动画分开,说GeometryAnimatorTextureAnimator等,但Model可能当然也是静态的。

我看到的是,策略模式(无静态实体)和装饰器模式都可以用来实现这一点。在这个应用程序中每个人有什么好处/缺点?还是我在复杂的事情?

感谢您的帮助!

回答

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 *的接口,客户端必须相应地进行转换。然后他们创建隐藏所需转换的引用类型。

对于您的所有编程解决方案,您不需要始终采用经典的设计模式。将它们视为工具和建议,但始终要问哪种设计模式对于给定问题起作用并不总是会导致最直接的解决方案。你必须自己思考,但设计模式可以帮助你。

+3

与COM设计相似的声音 – YeenFei 2010-06-25 06:05:31

+0

XSI和Maya SDK实际上跟随着COM,而不是严格遵守MS的约定(例如:没有IUnknown接口,处理引用计数和铸造的包装等) – stinky472 2010-06-25 07:08:31

+0

好的,那么你是什么基本上说是从'Geometry'派生的,它应该声明一个'virtual void update()',并为每个动画类型覆盖这个方法?我其实是想到了这一点,但是很可能我迷失在努力使一切“都是正确的方式”。谢谢! – bbtrb 2010-06-25 14:10:19

1

装饰模式通常用于无法修改的结构。策略模式可以用于完全控制的结构中,但也可让您允许其他人更改行为,而无需像“装饰者”那样“围绕”它。

+0

从这个角度看它现在非常有意义,谢谢! – bbtrb 2010-06-25 14:11:43

0

我认为你过于复杂。也许一个类(模型)就足够了?请记住只封装不同的东西。

如果您认为这是不够的,那么策略是可以的。例如,如果要使用许多不同的 TextureAnimator类并且能够在运行时切换它们。

装饰模式就像子类化,但可以在运行时完成(并支持多重继承)。它也很慢(我猜你正在编写一款游戏)。 IMO不是一个解决方案。

在这种情况下,我会编写一个类。如果我将来需要策略,我会重构代码。

+0

是的,我希望能够使用不同的TextureAnimators。然而,更重要的是,我想有一个框架,我可以轻松地对想法进行原型设计,实现物理仿真等等。我现在要和@臭豆腐的想法一起去看看它发生了什么。 – bbtrb 2010-06-25 14:15:21