Estou criando um jogo de tabuleiro (como xadrez) em Java, onde cada peça é seu próprio tipo (como Pawn
, Rook
etc.). Para a parte GUI do aplicativo, preciso de uma imagem para cada uma dessas peças. Desde fazendo pensa como
rook.image();
violar a separação da interface do usuário e da lógica de negócios, criarei um apresentador diferente para cada peça e, em seguida, mapeei os tipos de peça para seus apresentadores correspondentes, como
private HashMap<Class<Piece>, PiecePresenter> presenters = ...
public Image getImage(Piece piece) {
return presenters.get(piece.getClass()).image();
}
Por enquanto, tudo bem. No entanto, eu sinto que um guru prudente de OOP desaprovaria chamar um getClass()
método e sugeriria o uso de um visitante, por exemplo:
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;
}
}
Eu gosto dessa solução (obrigado, guru), mas tem uma desvantagem significativa. Sempre que um novo tipo de peça é adicionado ao aplicativo, o PieceVisitor precisa ser atualizado com um novo método. Eu gostaria de usar meu sistema como uma estrutura de jogo de tabuleiro, onde novas peças poderiam ser adicionadas através de um processo simples, em que o usuário da estrutura forneceria apenas a implementação da peça e de seu apresentador, e simplesmente a conectaria à estrutura. Minha pergunta: existe uma solução limpa de POO sem instanceof
, getClass()
etc. , que permita esse tipo de extensibilidade?