2011-03-02 2 views
3

Disons que nous avons une architecture classique polymorphes:Externaliser rendu des objets polymorphes

class Animal 
{ 
    virtual void eat() = 0; 
}; 

class Frog : public Animal 
{ 
    virtual void eat() { ... } 
}; 

class Chipmunk : public Animal 
{ 
    virtual void eat() { ... } 
}; 

C'est très bien. Mais quand il s'agit de rendu, je pourrais ajouter une méthode virtuelle render à la classe de base Animal tout comme la méthode eat.

Mais les fichiers sources des animaux ont des dépendances avec la bibliothèque particulière utilisée. Cela ne rend pas les choses modulables et maintenables. De plus, leur code de rendu ne les concerne fondamentalement pas.

Quelle est une bonne façon de mettre le code spécifique au rendu hors des classes dérivées? Quand je dis bien, je veux dire sans utiliser quelque chose comme une méthode surchargée qui retourne un nombre différent pour chaque classe dérivée, donc je peux faire un grand si ... sinon si ....

Répondre

3

Jetez un oeil à la Visitor Pattern - La fonction render() virtuelle est passée une instance d'un Visitor, puis appelle Visitor.renderMe(this). Le visiteur surcharge alors renderMe selon le besoin et contient le code spécifique au rendu.

+0

+1 C'est exactement le problème que le modèle de visiteur était destiné à résoudre. –

1

Ou consultez le Bridge Pattern.

Les classes d'animaux peuvent avoir une méthode de rendu, mais plutôt que d'implémenter les méthodes de rendu dans une API particulière, vous les écrivez dans une API de rendu abstraite. Ensuite, vous fournissez une ou plusieurs implémentations concrètes de l'API de rendu. Maintenant, le rendu animal est découplé de la technologie de rendu spécifique, et les deux côtés dépendent d'une API neutre et abstraite.

Questions connexes