Sto creando un gioco da tavolo (come gli scacchi) in Java, dove ogni pezzo è del suo tipo (come Pawn
, Rook
ecc.). Per la parte GUI dell'applicazione ho bisogno di un'immagine per ciascuno di questi pezzi. Dal momento che fare pensa come
rook.image();
viola la separazione dell'interfaccia utente e della logica aziendale, creerò un presentatore diverso per ogni pezzo e quindi mapperò i tipi di pezzo ai presentatori corrispondenti come
private HashMap<Class<Piece>, PiecePresenter> presenters = ...
public Image getImage(Piece piece) {
return presenters.get(piece.getClass()).image();
}
Fin qui tutto bene. Tuttavia, sento che un guru OOP prudente si acciglierebbe nel chiamare un getClass()
metodo e suggerirebbe di usare un visitatore per esempio come questo:
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;
}
}
Mi piace questa soluzione (grazie, guru), ma ha uno svantaggio significativo. Ogni volta che un nuovo tipo di pezzo viene aggiunto all'applicazione, PieceVisitor deve essere aggiornato con un nuovo metodo. Vorrei utilizzare il mio sistema come framework di giochi da tavolo in cui i nuovi pezzi potevano essere aggiunti attraverso un semplice processo in cui l'utente del framework avrebbe fornito l'implementazione sia del pezzo che del suo presentatore, e semplicemente lo avrebbe inserito nel framework. La mia domanda: esiste una soluzione OOP pulita senza instanceof
, getClass()
ecc. Che consentirebbe questo tipo di estensibilità?