我正在用Java创建一个棋盘游戏(例如国际象棋),其中每个棋子都是自己的类型(例如Pawn
,Rook
等等)。对于应用程序的GUI部分,我需要为每个这些部分提供一个图像。既然做的像
rook.image();
违反了UI和业务逻辑的分离,我将为每个作品创建一个不同的演示者,然后将作品类型映射到其相应的演示者,例如
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。我想将我的系统用作棋盘游戏框架,可以通过一个简单的过程添加新作品,其中框架的用户只能提供作品及其演示者的实现,并将其插入框架中即可。我的问题:是否有没有等等的干净的OOP解决方案instanceof
,getClass()
它将允许这种可扩展性?