Her parça (gibi kendi türüdür Java, (örneğin satranç gibi) bir masa oyunu yaratacağım Pawn
, Rook
vs.). Uygulamanın GUI kısmı için bu parçaların her biri için bir görüntüye ihtiyacım var. Yaptığımdan beri
rook.image();
UI ve iş mantığının ayrılmasını ihlal ediyor, her parça için farklı bir sunucu oluşturacağım ve daha sonra parça türlerini
private HashMap<Class<Piece>, PiecePresenter> presenters = ...
public Image getImage(Piece piece) {
return presenters.get(piece.getClass()).image();
}
Çok uzak çok iyi. Ancak, ihtiyatlı bir OOP gurusunun bir getClass()
yöntem çağrıldığında kaşlarını çattığını ve örneğin böyle bir ziyaretçi kullanmanızı önerdiğini hissediyorum :
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;
}
}
Bu çözümü seviyorum (teşekkür ederim, guru), ancak önemli bir dezavantajı var. Uygulamaya her yeni parça türü eklendiğinde, PieceVisitor yeni bir yöntemle güncellenmelidir. Sistemimi, çerçeve kullanıcısının sadece hem parçanın hem de sunum yapan kişinin uygulanmasını sağlayacağı ve çerçeveye ekleyeceği basit bir işlemle yeni parçaların eklenebileceği bir masa oyunu çerçevesi olarak kullanmak istiyorum. Benim sorum: Bu tür genişletilebilirliğe izin verecek instanceof
, getClass()
vb. Olmadan temiz bir OOP çözümü var mı?