2010-09-24 29 views
0

J'essaie de faire une petite et simple interface graphique en C++ (avec SDL). J'expérimente le modèle Composite pour avoir une solution flexible.Ai-je besoin d'un visiteur pour mon composant?

J'ai une classe Widget, avec des objets Component: par exemple, il y a un composant PaintingComponent; si je veux dessiner une boîte, j'utiliserai un composant PaintBox, qui hérite du composant PaintingComponent.

La classe Widget idéal ressemblerait un peu comme ça:

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

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

Ma question est simple: quelle est la meilleure façon d'activer cette composante quand je besoin?

Je suis d'abord allé avec une fonction "affichage" dans la classe Widget. Mais je vois deux problèmes:

1 °) Je perds le polymorphisme pur de "Compoonent" dans Widget, puisque je suis obligé de déclarer un composant particulier du widget comme PaintingComponent. Je peux faire face à cela, car il est logique qu'un widget devrait être affiché. 2 °) Plus gênant, j'ai besoin de transmettre des informations entre mon programme principal et mon composant PaintingComponent. Soit je passe l'écran SDL_Surface * à PaintingComponent, et il peint l'image qu'il dessine, soit je donne à mon composant une référence à l'objet qui a besoin de recevoir l'image qu'il a dessinée (et cet objet peindra l'image sur l'écran). Dans les deux cas, Widget devra gérer les données et devra savoir ce qu'est une SDL_Surface *. Je perds le couplage lâche, et je ne le veux pas. Ensuite, j'ai envisagé d'utiliser un modèle "Visiteur", mais je n'y suis pas habitué et avant d'essayer de l'implémenter, j'aimerais avoir votre avis.

Comment procéderiez-vous pour avoir une solution flexible et solide dans ce cas? Merci d'avance !

Répondre

1

Si vous prévoyez de changer de système graphique plus tard, vous pouvez implémenter ce modèle. Le visiteur va au nœud racine, puis récursivement à tous les enfants, les dessinant sur une certaine surface (connue seulement du Visiteur lui-même). Vous pouvez rassembler "liste d'affichage" avec cela, puis l'optimiser avant de dessiner (par exemple, sur OpenGL appliquer z-tri (z inférieur en premier)

+0

Merci, j'ai réussi à le faire à peu près comme vous le décrivez. Mais ça change tellement de choses dans l'architecture globale que c'est un peu déroutant au début ... Maintenant, je dois comprendre comment utiliser visitor + widget + Widget dans les widgets! ... Quoi qu'il en soit, tu m'as convaincu: mieux vaut pouvoir changer de graphismes plus tard. encore. – Raveline