ฉันกำลังสร้างเกมกระดาน (เช่นหมากรุก) ใน 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()
อื่น ๆ ซึ่งจะอนุญาตให้มีการขยายประเภทนี้หรือไม่?