Tworzę grę planszową (takich jak szachy) w Javie, gdzie każdy element ma swój własny typ (jak Pawn, Rookitd.). Do części GUI aplikacji potrzebuję obrazu dla każdego z tych elementów. Ponieważ robienie myśli jak
rook.image();
narusza separację interfejsu użytkownika i logiki biznesowej, utworzę inny prezenter dla każdego elementu, a następnie przypiszę typy elementów do odpowiednich prezenterów, takich jak
private HashMap<Class<Piece>, PiecePresenter> presenters = ...
public Image getImage(Piece piece) {
return presenters.get(piece.getClass()).image();
}
Jak na razie dobrze. Jednak wyczuwam, że rozsądny guru OOP zmarszczyłby brwi po wywołaniu getClass()metody i sugerowałby użycie gościa, na przykład takiego:
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;
}
}
Podoba mi się to rozwiązanie (dziękuję, guru), ale ma jedną istotną wadę. Za każdym razem, gdy do aplikacji dodawany jest nowy typ elementu, PieceVisitor wymaga aktualizacji o nową metodę. Chciałbym użyć mojego systemu jako frameworka do gry planszowej, w którym nowe elementy mogłyby być dodawane za pomocą prostego procesu, w którym użytkownik frameworka zapewniłby jedynie implementację zarówno elementu, jak i jego prezentera, i po prostu podłączył go do frameworka. Moje pytanie: czy istnieje czyste rozwiązanie OOP bez instanceof, getClass()itd., Które pozwoliłyby na tego rodzaju rozciągliwości?
