Je crée un jeu de plateau (comme les échecs) en Java, où chaque pièce est de son propre type (comme Pawn
, Rook
etc.). 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é?