मैं जावा में एक बोर्ड गेम (जैसे शतरंज) बना रहा हूं, जहां प्रत्येक टुकड़ा का अपना प्रकार (जैसे Pawn
, Rook
आदि) है। आवेदन के जीयूआई भाग के लिए मुझे इनमें से प्रत्येक टुकड़े के लिए एक छवि की आवश्यकता है। चूंकि सोच समझ कर करते हैं
rook.image();
UI और व्यावसायिक तर्क के पृथक्करण का उल्लंघन करता है, मैं प्रत्येक टुकड़े के लिए एक अलग प्रस्तोता बनाऊंगा और फिर उनके समान अंशों के लिए टुकड़ा प्रकारों का मानचित्र तैयार करूंगा
private HashMap<Class<Piece>, PiecePresenter> presenters = ...
public Image getImage(Piece piece) {
return presenters.get(piece.getClass()).image();
}
अब तक सब ठीक है। हालांकि, मुझे लगता है कि एक विवेकपूर्ण ओओपी गुरु एक 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;
}
}
मुझे यह समाधान पसंद है (धन्यवाद, गुरु), लेकिन इसकी एक महत्वपूर्ण कमी है। हर बार जब एक नया टुकड़ा टाइप किया जाता है, तो एप्लिकेशन को एक नए तरीके से अपडेट करने की आवश्यकता होती है। मैं एक बोर्ड गेम फ्रेमवर्क के रूप में अपने सिस्टम का उपयोग करना चाहूंगा जहां नए टुकड़े एक सरल प्रक्रिया के माध्यम से जोड़े जा सकते हैं जहां फ्रेमवर्क का उपयोगकर्ता केवल टुकड़ा और उसके प्रस्तुतकर्ता दोनों का कार्यान्वयन प्रदान करेगा, और बस इसे फ्रेमवर्क में प्लग कर देगा। मेरा प्रश्न: आदि के बिना एक साफ ओओपी समाधान है instanceof
, getClass()
जो इस तरह के विस्तार के लिए अनुमति देगा?