Esta tecnica se utiliza cuando un objeto A tiene que responder de una u otra forma dependiendo del tipo de objeto que es B dentro de una Jerarquia Polimorfica.
La mala solucion a este problema seria darle la responsabilidad al objeto A de checar el tipo del objeto polimorfico con el operador ‘instanceof’ o similar.
La solucion correcta recaeria en dejar que la responsabilidad recayera en cada uno de los objetos B polimorficos, de modo que ellos le pidan a el Objeto A ejecutar el metodo con ellos, pasandose a si mismos como parametro
abstractclassPerson{voidgreet(){System.out.println("Hi!");}abstractvoidaccept(Globalglobal);}classMenextendsPerson{@Overridevoidaccept(Globalglobal){global.visit(this);}}classWomenextendsPerson{@Overridevoidaccept(Globalglobal){global.visit(this);}}classGlobal{voidgreet(Personperson){person.greet();person.accept(this);}voidvisit(Menmen){System.out.println("I accept a men");}voidvisit(Womenwomen){System.out.println("I accept a women");}}
Ahora para probarlo podriamos utilizar cualquier objeto polimorfico sin problemas