Является ли следующая реализация java шаблона посетителя использованием дженериков, достаточно общего для того, чтобы быть полезным? (Я полагаю, это так).Общий шаблон посетителя в java
Может ли это быть каким-то образом улучшено? Очень важно, чтобы с помощью анонимных классов было легко работать с вызовами. Благодарю.
(Пример использования):
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());
Определения:
//............................................
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
as donroby указывает, что ваш код не полностью соответствует шаблону посетителя. Я думаю, что в нем есть больше шаблонов стратегии (другие мнения могут отличаться). Ваш код напоминает мне Collections.sort (List, Comparator), поэтому у него может быть полезная информация. – josefx
Вчера я увидел * превосходный пример шаблона посетителя в ответе [aioobe] (http://stackoverflow.com/questions/3930808/is-there-a-better-option-for-this-code). Прочитайте весь вопрос, это сделает весь смысл шаблона более понятным. – BalusC
@josefx Является ли новая версия шаблоном посетителя? (Смотри ниже). – cibercitizen1