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()
등 확장 성이 종류를 허용 것인가?