L'implémentation java suivante du modèle de visiteur utilisant des génériques est-elle assez générale pour être utile? (Je suppose que c'est).Modèle de visiteur générique dans Java
Pourrait-il être amélioré d'une manière ou d'une autre? Il est important d'être facilement appelable en utilisant des classes anonymes. Merci.
(Exemple d'utilisation):
Vector<Number> numbers = new Vector<Number>();
numbers.add(new Double(1.2));
numbers.add(new Float(-1.2));
numbers.add(new Double(4.8));
numbers.add(new Float(-3.4));
numbers.add(new Long(123456));
numbers.add(new Short("14"));
For.each(numbers, new Visitor<Number>() {
public void doIt(Double n) {
System.out.println("doIt() for double: " + n);
}
public void doIt(Float n) {
System.out.println("doIt() for float: " + n);
}
public void doIt(Number n) {
System.out.println("doIt() for Number: " + n);
}
});
Visitor<Number> visi = new Visitor<Number>() {
private StringBuffer all = new StringBuffer();
public void doIt(Number n) {
System.out.println("doIt() for Number: " + n);
all.append(n.toString() + " ");
}
public Object getResult() {
return all;
}
};
For.each(numbers, visi);
System.out.println ("all -> " + visi.getResult());
Définitions:
//............................................
abstract class Visitor<T> {
public void visit(T n) {
try {
this.getClass().getDeclaredMethod("doIt", n.getClass()).invoke(this, n);
} catch (Exception ex) {
doIt((T) n);
}
}
public void doIt(T n) {
System.out.println("doIt() for base " + n);
}
public Object getResult() {
return null;
}
} // class
//............................................
class For {
public static <T> void each (Collection<T> c, Visitor<T> f) {
for (T v : c) {
f.visit(v);
}
} //()
} // class
comme donroby souligne que votre code ne correspond pas complètement au modèle de visiteur. Je pense qu'il y a plus de schéma de stratégie (les autres opinions peuvent varier). Votre code me rappelle Collections.sort (Liste, Comparateur) donc il peut avoir quelques informations utiles. – josefx
Hier, j'ai vu un * excellent * exemple du modèle Visitor dans [la réponse d'aioobe] (http://stackoverflow.com/questions/3930808/is-there-a-better-option-for-this-code). Lisez toute la question, cela rendra tout le sens du motif. – BalusC
@josefx La nouvelle version est-elle maintenant le modèle de visiteur? (Voir ci-dessous). – cibercitizen1