Je crée un jeu de plateau (comme les échecs) en Java, où chaque pièce est de son propre type (comme Pawn , Rooketc.). Pour la partie GUI de l'application, j'ai besoin d'une image pour chacune de ces pièces. Puisque faire pense comme
rook.image();viole la séparation de l'interface utilisateur et de la logique métier, je vais créer un présentateur différent pour chaque pièce, puis mapper les types de pièces à leurs présentateurs correspondants, comme
private HashMap<Class<Piece>, PiecePresenter> presenters = ...
public Image getImage(Piece piece) {
  return presenters.get(piece.getClass()).image();
}Jusqu'ici tout va bien. Cependant, je sens qu'un gourou de la POO prudent froncerait les sourcils en appelant ungetClass() méthode et suggérerait d'utiliser un visiteur par exemple comme ceci:
class Rook extends Piece {
  @Override 
  public <T> T accept(PieceVisitor<T> visitor) {
    return visitor.visitRook(this);
  }
}
class ImageVisitor implements PieceVisitor<Image> {
  @Override  
  public Image visitRook(Rook rook) {
    return rookImage;
  } 
}J'aime cette solution (merci, gourou), mais elle a un inconvénient majeur. Chaque fois qu'un nouveau type de pièce est ajouté à l'application, PieceVisitor doit être mis à jour avec une nouvelle méthode. Je voudrais utiliser mon système comme cadre de jeu de société où de nouvelles pièces pourraient être ajoutées grâce à un processus simple où l'utilisateur du cadre ne fournirait que la mise en œuvre de la pièce et de son présentateur, et le brancherait simplement dans le cadre. Ma question: existe-t-il une solution propre de POO sans instanceof, getClass()etc. qui permettrait ce type d'extensibilité?
