Я создаю настольную игру (например, шахматы) на Java, где каждая фигура имеет свой собственный тип (например Pawn, Rookи т. Д.). Для графической части приложения мне нужно изображение для каждой из этих частей. Поскольку делать думает, как
rook.image();
нарушает разделение пользовательского интерфейса и бизнес-логики, я создаю отдельного презентатора для каждого фрагмента, а затем сопоставляю типы фрагментов с соответствующими им презентаторами, например
private HashMap<Class<Piece>, PiecePresenter> presenters = ...
public Image getImage(Piece piece) {
return presenters.get(piece.getClass()).image();
}
Все идет нормально. Однако я чувствую, что осмотрительный гуру ООП будет недоволен вызовом getClass()метода и предложил бы использовать посетителя, например, так:
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;
}
}
Мне нравится это решение (спасибо, гуру), но у него есть один существенный недостаток. Каждый раз, когда в приложение добавляется новый тип фрагмента, PieceVisitor должен обновляться новым методом. Я хотел бы использовать мою систему в качестве фреймворка для настольной игры, где новые части могут быть добавлены с помощью простого процесса, когда пользователь фреймворка будет только обеспечивать реализацию как фрагмента, так и его презентатора, и просто подключит его к фреймворку. Мой вопрос: есть ли чистое решение ООП без instanceofи getClass()т. Д., Которое позволило бы для такого типа расширяемости?
