प्रसंग
मैं वस्तुओं के पदानुक्रम (एक अभिव्यक्ति वृक्ष) के साथ एक "छद्म" आगंतुक पैटर्न (छद्म) का उपयोग कर रहा हूं, क्योंकि इसमें दोहरे प्रेषण का उपयोग नहीं किया गया है):
public interface MyInterface
{
void Accept(SomeClass operationClass);
}
public class MyImpl : MyInterface
{
public void Accept(SomeClass operationClass)
{
operationClass.DoSomething();
operationClass.DoSomethingElse();
// ... and so on ...
}
}
यह डिजाइन, हालांकि, प्रश्नात्मक, बहुत सहज था क्योंकि MyInterface के कार्यान्वयन की संख्या महत्वपूर्ण है (~ 50 या अधिक) और मुझे अतिरिक्त संचालन जोड़ने की आवश्यकता नहीं थी।
प्रत्येक कार्यान्वयन अद्वितीय है (यह एक अलग अभिव्यक्ति या ऑपरेटर है), और कुछ कंपोजिट हैं (यानी, ऑपरेटर नोड्स जिसमें अन्य ऑपरेटर / पत्ती नोड्स शामिल होंगे)।
ट्रावर्सल को वर्तमान में ट्री के रूट नोड पर एक्सेप्ट ऑपरेशन को कॉल करके किया जाता है, जो बदले में अपने प्रत्येक बच्चे के नोड्स पर कॉल स्वीकार करता है, जो बदले में ... और इसी तरह ...
लेकिन समय आ गया है जहाँ मुझे एक नया ऑपरेशन जोड़ने की जरूरत है , जैसे कि सुंदर छपाई:
public class MyImpl : MyInterface
{
// Property does not come from MyInterface
public string SomeProperty { get; set; }
public void Accept(SomeClass operationClass)
{
operationClass.DoSomething();
operationClass.DoSomethingElse();
// ... and so on ...
}
public void Accept(SomePrettyPrinter printer)
{
printer.PrettyPrint(this.SomeProperty);
}
}
मुझे मूल रूप से दो विकल्प दिखाई देते हैं:
- रख-रखाव की कीमत पर, प्रत्येक व्युत्पन्न वर्ग के लिए मेरे संचालन के लिए एक नया तरीका जोड़ते हुए एक ही डिज़ाइन रखें (एक विकल्प नहीं, IMHO)
- एक्स्टेंसिबिलिटी की कीमत पर "ट्रू" विज़िटर पैटर्न का उपयोग करें (एक विकल्प नहीं, जैसा कि मुझे उम्मीद है कि रास्ते में और अधिक कार्यान्वयन आने वाले हैं ...), यात्रा विधि के लगभग 50+ ओवरलोड के साथ, प्रत्येक एक विशिष्ट कार्यान्वयन से मेल खाता है। ?
सवाल
क्या आप विज़िटर पैटर्न का उपयोग करने की सिफारिश करेंगे? क्या कोई अन्य पैटर्न है जो इस मुद्दे को हल करने में मदद कर सकता है?
MyInterface
.. क्या उन सभी वर्गों का एक अद्वितीय कार्यान्वयन है DoSomething
और DoSomethingElse
? मैं यह नहीं देखता कि आपका आगंतुक वर्ग वास्तव में पदानुक्रम का पता कैसे facade