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