abstract class Entidad{ protected Visitor miVisitor; public abstract void accept(Visitor v); public void atacar(Entidad){ ... } } class Aliado extends Entidad{ ... public void accept(Visitor v){ v.visitAliado(this) } } class Enemigo extends Entidad{ protected Visitor miVisitor; ... public void accept(Visitor v){ v.visitEnemigo(this) } } abstract class Visitor{ protected Entidad miEntidad; public abstract visitAliado(Aliado a); public abstract visitEnemigo(Enemigo e); } class VisitorAliado extends Visitor{ public visitAliado(Aliado a){} public visitEnemigo(Enemigo e){ this.miEntidad.atacar(e) } } class VisitorEnemigo extends Visitor{ public visitAliado(Aliado a){ this.miEntidad.atacar(e) } public visitEnemigo(Enemigo e){} }