Saya membuat permainan papan (seperti catur) di Jawa, di mana masing-masing bagian adalah jenisnya sendiri (seperti Pawn
, Rook
dll.). Untuk bagian GUI dari aplikasi saya perlu gambar untuk masing-masing bagian ini. Sejak melakukan berpikir seperti
rook.image();
melanggar pemisahan UI dan logika bisnis, saya akan membuat presenter yang berbeda untuk masing-masing bagian dan kemudian memetakan jenis potongan ke penyaji yang sesuai seperti
private HashMap<Class<Piece>, PiecePresenter> presenters = ...
public Image getImage(Piece piece) {
return presenters.get(piece.getClass()).image();
}
Sejauh ini baik. Namun, saya merasakan guru OOP yang bijaksana akan mengerutkan kening ketika memanggil getClass()
metode dan akan menyarankan menggunakan pengunjung misalnya seperti ini:
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;
}
}
Saya suka solusi ini (terima kasih, guru), tetapi memiliki satu kelemahan signifikan. Setiap kali tipe bagian baru ditambahkan ke aplikasi, PieceVisitor perlu diperbarui dengan metode baru. Saya ingin menggunakan sistem saya sebagai kerangka permainan papan di mana potongan-potongan baru dapat ditambahkan melalui proses sederhana di mana pengguna kerangka kerja hanya akan memberikan implementasi baik karya dan presenternya, dan cukup tancapkan ke kerangka kerja. Pertanyaan saya: apakah ada solusi OOP yang bersih tanpa instanceof
, getClass()
dll. Yang memungkinkan perluasan jenis ini?