Я создаю настольную игру (например, шахматы) на 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()
т. Д., Которое позволило бы для такого типа расширяемости?