मैं विज़िटर पैटर्न के साथ थोड़ा सा असभ्य हूं, लेकिन मेरे पास एक ऐसा कार्य है जिसके लिए विज़िटर कार्यान्वयन होना आवश्यक है (यदि मैं "उदाहरण" चेक से बचना चाहता हूं)।"exampleof" को प्रतिस्थापित करने के लिए विज़िटर पैटर्न का उपयोग कैसे करें
मेरे पास एक वर्ग है जो कई gwt तत्वों के लिए एक रैपर है: लेबल, पैनल, विजेट (चेकबॉक्स, सूची बॉक्स, टेक्स्टबॉक्स आदि हो सकता है)। मैं UI के समान भागों के संग्रह के रूप में एक सरणी का उपयोग करता हूं। जैसे लेबल + चेकबॉक्स, लेबल + टेक्स्ट बॉक्स; लेबल + बटन इत्यादि
कुछ तत्व अलग-अलग तरीके से बनाए गए हैं (उदाहरण के लिए, किसी अन्य वर्ग का हिस्सा, उदाहरण के लिए, पैनल)। इसलिए नतीजतन मेरे पास दो रचनाकार हैं जो समान हैं, लेकिन एक स्थान पर अधिभारित विधि का उपयोग किया जाता है। मैं इन रचनाकारों को विलय कर सकता हूं और उल्लिखित विधि के अंदर "exampleof" का उपयोग करके तत्व की जांच कर सकता हूं। लेकिन मैं इस समाधान को नापसंद करता हूं और विज़िटर पैटर्न का उपयोग करके इसे प्रतिस्थापित करना चाहता हूं। सच्चाई बताने के लिए, मुझे नहीं पता कि यह कैसे करें और आपकी मदद के लिए आशा करें।
public class MyWidgets {
private String stringLabel;
private Widget widget;
private Panel panel;
public MyWidgets(String stringLabel, Widget widget) {
this.stringLabel = stringLabel;
this.widget = widget;
initPanel(stringLabel, widget);
}
public MyWidgets(ConstructedClass cs, Widget widget) {
this.widget = widget;
initPanel(cs, widget);
}
private initPanel(String label, Widget widget) {
panel = SomeStaticUtilityClass.initPanel(new Label(label), widget);
}
private initPanel(ConstructedClass cs, Widget widget) {
panel = SomeStaticUtilityClass(cs, widget);
}
}
कुछ इस तरह (मैं इसे अधिकतम सार करने की कोशिश की, वास्तव में यह और अधिक कठिन है):
यहाँ मैं क्या है का एक उदाहरण है।
तो मैं एक समाधान "instanceof" का उपयोग किया है:
private initPanel(Object object, Widget widget) {
if(object instanceof String) {
panel = SomeStaticUtilityClass.initPanel(new Label(label), widget);
}
if(object instanceof ConstructedClass) {
panel = SomeStaticUtilityClass.initPanelFromObject(cs, widget);
}
}
मैं "instanceof" से बचा लिया और उसके अतिभारित संस्करण के बिना सिर्फ एक निर्माता और यहां तक कि, अगर यह संभव है, एक init विधि छोड़ करना चाहते हैं । आपके सुझावों, सहायता के लिए अग्रिम धन्यवाद।
पी.एस> मैं फिर कहता हूँ, उस वर्ग के ऊपर निर्मित है, और कुछ गलतफहमी की तरह दिखता है, विशेष रूप से इस स्ट्रिंग लेबल :)
हम्म .. कुछ पंक्ति के साथ अजीब लगता है: "पैनल = कुछ स्टेटिक यूटिलिटी क्लास (सीएस, विजेट);"। क्या StStaticUtility क्लास या एक विधि क्लास है? :) – Javaguru
मैंने उदाहरण – Dragon