Tôi đang tạo một trò chơi cờ (như cờ vua) trong Java, trong đó mỗi quân cờ là loại riêng của nó (như Pawn
, Rook
v.v.). Đối với phần GUI của ứng dụng, tôi cần một hình ảnh cho mỗi phần này. Kể từ khi làm như nghĩ
rook.image();
vi phạm sự tách biệt giữa UI và logic nghiệp vụ, tôi sẽ tạo một người thuyết trình khác nhau cho mỗi phần và sau đó ánh xạ các loại phần cho người thuyết trình tương ứng của họ như
private HashMap<Class<Piece>, PiecePresenter> presenters = ...
public Image getImage(Piece piece) {
return presenters.get(piece.getClass()).image();
}
Càng xa càng tốt. Tuy nhiên, tôi cảm thấy một bậc thầy OOP khôn ngoan sẽ cau mày khi gọi một getClass()
phương thức và sẽ đề nghị sử dụng một khách truy cập chẳng hạn như thế này:
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;
}
}
Tôi thích giải pháp này (cảm ơn bạn, guru), nhưng nó có một nhược điểm đáng kể. Mỗi khi một loại mảnh mới được thêm vào ứng dụng, PieceVisitor cần được cập nhật với một phương thức mới. Tôi muốn sử dụng hệ thống của mình làm khung trò chơi hội đồng, nơi các phần mới có thể được thêm vào thông qua một quy trình đơn giản trong đó người dùng của khung sẽ chỉ cung cấp triển khai cả phần và người trình bày của nó, và chỉ cần cắm nó vào khung. Câu hỏi của tôi: có một giải pháp OOP sạch mà không có instanceof
, getClass()
vv sẽ cho phép loại mở rộng này?