2011-12-20 19 views
10

In questo question si dice che posso utilizzare il modello visitatore invece di un gruppo di instanceof s. Jmg ha dichiarato: "Se non sei libero di modificare A, B e C, puoi applicare il modello di visitatore per ottenere lo stesso risultato."Modello visitatore Java invece di instanceof switch

Per quanto ho capito, devo ancora fare un visitatore di supporto A, B e C (ad esempio, un metodo accept()).

Il mio problema è che non ho assolutamente alcuna possibilità di cambiare A, B e C. Ho appena ricevuto l'oggetto Auto dalla libreria straniera e devo chiamare il metodo wash() specifico per camion, auto da corsa e autobus.

Penso di avere ancora bisogno di una costruzione if-else-if con instanceof s. Ho ragione?

+0

Vedi anche http://stackoverflow.com/questions/14136721/converting-many-if-else-statements-to-a-cleaner-approach – Raedwald

+0

Vedere anche http://stackoverflow.com/questions/18231983/java -alternativa-a-molti-else-if-dichiarazioni-con-instanceof-condizioni – Raedwald

risposta

9

Sì, per implementare il modello di visitatore ora è necessario accedere alla sorgente di A, B e C, a meno che tutte le classi abbiano la stessa firma (quindi tutti hanno il metodo wash() con lo stesso nome). In tal caso, è possibile utilizzare il polimorfismo per chiamare il metodo corretto.

Altrimenti, è possibile aggiungere funzionalità a classi a cui non si ha accesso a livello di codice sorgente. Sul articolo di Wikipedia sul modello Visitor (http://en.wikipedia.org/wiki/Visitor_pattern) c'è una piccola nota in calce sotto l'esempio Java:

Nota: Un approccio più flessibile questo modello è quello di creare una classe wrapper che implementa l'interfaccia che definisce il metodo accept. Il wrapper contiene un riferimento che punta al CarElement che può essere inizializzato tramite il costruttore. Questo approccio evita di dover implementare un'interfaccia su ciascun elemento. [Vedi articolo Java Tip 98 articolo qui sotto]

Si fa riferimento a questo articolo: http://www.javaworld.com/javaworld/javatips/jw-javatip98.html

Quindi, tutto sommato è possibile, ma dà un numero enorme di classi per la piccola attività che si desidera fare. Rimanerei con l'instanceof se fossi in te.