Ich erstelle ein Brettspiel (wie Schach) in Java, wo jedes Stück seine eigene Art ist (wie Pawn
, Rook
etc.). Für den GUI-Teil der Anwendung benötige ich für jedes dieser Teile ein Bild. Da denkt das ja gerne
rook.image();
Verstößt die Trennung von Benutzeroberfläche und Geschäftslogik, erstelle ich für jedes Stück einen anderen Präsentator und ordne dann die Stücktypen den entsprechenden Präsentatoren zu
private HashMap<Class<Piece>, PiecePresenter> presenters = ...
public Image getImage(Piece piece) {
return presenters.get(piece.getClass()).image();
}
So weit, ist es gut. Ich spüre jedoch, dass ein umsichtiger OOP-Guru beim Aufrufen einer getClass()
Methode die Stirn runzelt und die Verwendung eines Besuchers zum Beispiel so vorschlägt:
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;
}
}
Ich mag diese Lösung (danke, Guru), aber sie hat einen wesentlichen Nachteil. Jedes Mal, wenn der Anwendung ein neuer Stücktyp hinzugefügt wird, muss der PieceVisitor mit einer neuen Methode aktualisiert werden. Ich möchte mein System als Brettspiel-Framework verwenden, in dem neue Teile durch einen einfachen Prozess hinzugefügt werden können, bei dem der Benutzer des Frameworks nur die Implementierung des Teils und seines Präsentators bereitstellt und es einfach in das Framework einfügt. Meine Frage: Gibt es eine saubere OOP Lösung ohne instanceof
, getClass()
etc. , die für diese Art von Erweiterbarkeit ermöglichen würden?