डिज़ाइन पैटर्न के लेखकों ने जिस चीज़ के बारे में सबसे अधिक चिंतित किया, वह "विज़िटर" पैटर्न था।
यह एक "आवश्यक बुराई" है - लेकिन अक्सर इसका उपयोग किया जाता है और इसके लिए की आवश्यकता अक्सर आपके डिजाइन में एक अधिक मूलभूत दोष को प्रकट करती है।
"विज़िटर" पैटर्न का एक वैकल्पिक नाम "मल्टी-डिस्पैच" है, क्योंकि विज़िटर पैटर्न वह है जो आप तब समाप्त करते हैं जब आप दो प्रकार के आधार पर उपयोग करने के लिए कोड का चयन करने के लिए एकल-प्रकार प्रेषण ओओ भाषा का उपयोग करना चाहते हैं (या अधिक) विभिन्न वस्तुओं।
क्लासिक उदाहरण यह है कि आपके पास दो आकृतियों के बीच चौराहा है, लेकिन एक और भी सरल मामला है जिसे अक्सर अनदेखा किया जाता है: दो विषम वस्तुओं की समानता की तुलना करना।
वैसे भी, अक्सर आप कुछ इस तरह से समाप्त करते हैं:
interface IShape
{
double intersectWith(Triangle t);
double intersectWith(Rectangle r);
double intersectWith(Circle c);
}
इसके साथ समस्या यह है कि आपने "IShape" के अपने सभी कार्यान्वयनों को एक साथ जोड़ दिया है। आपने निहित किया है कि जब भी आप पदानुक्रम में एक नया आकार जोड़ना चाहते हैं, तो आपको अन्य सभी "आकृति" कार्यान्वयनों को भी बदलना होगा।
कभी-कभी, यह सही न्यूनतम डिज़ाइन है - लेकिन इसके माध्यम से सोचें। क्या आपका डिज़ाइन वास्तव में जनादेश देता है जिसे आपको दो प्रकारों पर भेजने की आवश्यकता है? क्या आप बहु-तरीकों के दहनशील विस्फोट में से प्रत्येक को लिखने के लिए तैयार हैं?
अक्सर, एक और अवधारणा शुरू करने से आप उन संयोजनों की संख्या को कम कर सकते हैं जिन्हें आप वास्तव में लिखने जा रहे हैं:
interface IShape
{
Area getArea();
}
class Area
{
public double intersectWith(Area otherArea);
...
}
बेशक, यह निर्भर करता है - कभी-कभी आपको वास्तव में उन सभी विभिन्न मामलों को संभालने के लिए कोड लिखने की आवश्यकता होती है - लेकिन यह विराम लेने और विजिटर का उपयोग करने से पहले विराम लेने और सोचने के लायक है। यह आपको बाद में बहुत दर्द से बचा सकता है।