2010-06-25 58 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