2011-12-20 12 views
10

En este question se dice que puedo usar el patrón de visitante en lugar de un grupo de instanceof s. Jmg dijo "Si no puedes cambiar A, B y C, puedes aplicar el patrón de visitante para lograr lo mismo".Patrón de visitante de Java en lugar de instanceof switch

Por lo que tengo entendido, todavía tengo que hacer que los visitantes de soporte A, B y C (por ejemplo, tengan un método accept()).

Mi problema es que no tengo absolutamente ninguna posibilidad de cambiar A, B y C. Acabo de obtener el objeto del coche de la biblioteca extranjera y tengo que llamar al método wash() específico para camiones, coches de carreras y autobuses.

Creo que todavía necesito una construcción if-else-if con instanceof s. ¿Estoy en lo cierto?

+0

Véase también http://stackoverflow.com/questions/14136721/converting-many-if-else-statements-to-a-cleaner-approach – Raedwald

+0

Véase también http://stackoverflow.com/questions/18231983/java -alternative-to-many-else-if-statements-with-instanceof-conditions – Raedwald

Respuesta

9

Sí, para implementar el patrón de visitante ahora necesita acceso a la fuente de A, B y C, a menos que todas las clases tengan la misma firma (entonces todas tienen el método wash() con el mismo nombre). Si ese es el caso, puede usar el polimorfismo para llamar al método correcto.

De lo contrario, es posible agregar funcionalidad a las clases a las que no tiene acceso en el nivel del código fuente. En el artículo de Wikipedia sobre el patrón de Visitantes (http://en.wikipedia.org/wiki/Visitor_pattern) hay una pequeña nota a continuación el ejemplo de Java:

Nota: Un enfoque más flexible a este patrón es crear una clase contenedora implementando la interfaz que define el método de aceptación. El contenedor contiene una referencia que apunta al CarElement que podría inicializarse a través del constructor. Este enfoque evita tener que implementar una interfaz en cada elemento. [Véase el artículo de Java Tip 98 artículo siguiente]

Se hace referencia a este artículo: http://www.javaworld.com/javaworld/javatips/jw-javatip98.html

Así que, en todo lo posible, pero le da un enorme número de clases para la pequeña tarea que desea hacer. Me quedaría con el instanceof si fuera tú.

Cuestiones relacionadas