2012-12-05 3 views
0

Je suis aux prises avec la combinaison du visiteur et des modèles composites en Java.Modèle de visiteur et de composite

J'ai une interface élément pour le composite. Il a seulement la méthode d'acceptation.

J'ai une classe abstraite Composite pour gérer la fonction de gestion des enfants (add, remove et getChild). Je voudrais définir la méthode acccept dans la classe compiste pour éviter d'avoir à le faire dans chaque sous-classe. Y-a-t-il un moyen de faire ça?

public abstract class Composite implements Element { 

    protected List<Element> elements; 

    public Composite() { 
     elements = new ArrayList<Element>(); 
    } 

    public void add(Element e) { 
    elements.add(e); 
    } 

    public void remove(Element e) { 
     elements.remove(e); 
    } 

    public Element getChild(int i) { 
     return elements.get(i); 
    } 

} 
+0

Je ne vois pas pourquoi pas. Quel est votre problème exactement? Implémentez simplement 'accept()' dans 'Composite'. –

Répondre

2

N'est-ce pas ce que vous cherchez?

public abstract class Composite implements Element { 

    protected List<Element> elements; 

    public void accept(Visitor visitor) { 
     for(Element element: elements) { 
      element.accept(visitor); 
     } 
    } 

} 
+0

Kinda. J'allais pour une solution similaire mais avec, les sous-classes composites ne sont pas visitées. Et il doit être visité avant de passer par ses enfants. Dois-je remplacer la méthode accept dans chaque sous-classe et faire le visitor.visit (this); super.accept (visiteur); – qbisson

+0

Désolé, mais je n'ai toujours pas ce que vous essayez d'atteindre. Que voulez-vous dire quand vous dites que la sous-classe n'est pas visitée? Qu'attendez-vous qu'il se passe? –

+0

Composite est une classe abstraite. Vous ne pouvez donc pas faire de visitor.visit (this) dans la méthode accept de hte abstract class. – qbisson

Questions connexes