Soy un poco antipático con el patrón Visitor, pero tengo una tarea que debe tener la implementación Visitor (si quiero evitar las verificaciones "instanceof").Cómo utilizar el patrón de visitante para sustituir "instanceof"
Tengo una clase que es un contenedor para varios elementos gwt: Etiqueta, Panel, Widget (puede ser casilla de verificación, listbox, cuadro de texto, etc.). Uso una matriz como una colección de partes similares de UI. P.ej. Etiqueta + casilla de verificación, Etiqueta + cuadro de texto; Etiqueta + botón, etc.
Algunos elementos se construyen de forma diferente (parte de otra clase derivada, por ejemplo, del Panel). Entonces, como resultado, tengo dos constructores que son iguales, pero en un lugar se usa el método sobrecargado. Puedo fusionar estos constructores y verificar el elemento usando "instanceof" dentro del método mencionado. Pero no me gusta esta solución y quiero sustituirla por el patrón Visitor. A decir verdad, no sé cómo hacerlo y espero que lo ayudes.
Aquí es un ejemplo de lo que tengo:
public class MyWidgets {
private String stringLabel;
private Widget widget;
private Panel panel;
public MyWidgets(String stringLabel, Widget widget) {
this.stringLabel = stringLabel;
this.widget = widget;
initPanel(stringLabel, widget);
}
public MyWidgets(ConstructedClass cs, Widget widget) {
this.widget = widget;
initPanel(cs, widget);
}
private initPanel(String label, Widget widget) {
panel = SomeStaticUtilityClass.initPanel(new Label(label), widget);
}
private initPanel(ConstructedClass cs, Widget widget) {
panel = SomeStaticUtilityClass(cs, widget);
}
}
Algo como esto (he tratado de hacerlo máxima abstracto, en realidad es más difícil).
Así que tengo una solución utilizando "instanceof":
private initPanel(Object object, Widget widget) {
if(object instanceof String) {
panel = SomeStaticUtilityClass.initPanel(new Label(label), widget);
}
if(object instanceof ConstructedClass) {
panel = SomeStaticUtilityClass.initPanelFromObject(cs, widget);
}
}
quiero ser salvado de "instanceof" y dejar sólo un constructor e incluso, si es posible, un método de inicialización sin que su versión sobrecargada . Gracias de antemano por sus sugerencias, ayuda.
P.S> repito, que la clase anterior se fabrica, y se parece a un malentendido sobre todo con esta etiqueta Cadena :)
Hmm ... algo parece extraño con la siguiente línea: "panel = SomeStaticUtilityClass (cs, widget);". ¿SomeStaticUtilityClass es una clase o un método? :) – Javaguru
Corregí el ejemplo – Dragon