2010-09-24 88 views
0

我想在C++(使用SDL)中做一個小而簡單的GUI。我正在嘗試使用Composite模式以獲得靈活的解決方案。我需要一個訪問者來訪問我的組件嗎?

我有一個Widget類,有Component對象:例如,有一個PaintingComponent;如果我想繪製一個盒子,我將使用從PaintingComponent繼承的一個PaintingBoxComponent。

理想的Widget類看起來有點像:

Class Widget 
{ 
    private: 
    vector<Component*> myComponents; 

    public: 
    // A small number of methods able to communicate with the component 
    // without knowing their types 
} 

我的問題很簡單:什麼是我需要的時候啓動這個組件的最佳方式?

我首先在Widget類中使用了「顯示」功能。但我看到兩個問題:我正在丟失Widget中的「Compoonent」的純多態性,因爲我不得不將該部件的特定組件聲明爲PaintingComponent。我可以處理這個問題,因爲顯示Widget是合乎邏輯的。

2°)更麻煩的是,我需要在我的主程序和我的PaintingComponent之間傳遞信息。我可以將SDL_Surface *屏幕傳遞給PaintingComponent,並繪製它繪製的圖像,或者給我的組件提供需要接收它所繪製圖像的對象的引用(並且此對象將繪製圖像屏幕)。在這兩種情況下,Widget都必須處理數據,並且必須知道SDL_Surface *是什麼。我失去了鬆耦合,我不想那樣。

然後,我考慮使用「訪問者」模式,但我不習慣它,在我嘗試實現它之前,我想徵求您的意見。

在這種情況下,您將如何着手靈活而堅實的解決方案?提前致謝 !

回答

1

如果您計劃稍後更改圖形系統,則可以實現此模式。訪問者進入根節點,然後遞歸地傳遞給所有的孩子,在一些表面上繪製它們(只有Visitor本身已知)。您可以收集「顯示列表」,然後在繪製之前對其進行優化(例如,在OpenGL上應用z排序(較低的z首先)

+0

謝謝,我已經設法按照您的描述進行操作。但是它改變了全球架構中的很多東西,起初有點令人費解,現在,我必須弄清楚如何在widget中使用visitor + widget + Widget!無論如何,你說服了我:最好能夠稍後改變圖形。再次。 – Raveline 2010-09-24 19:21:29

相關問題