16

मैं एक कक्षा में हूं जहां हमने इन डिजाइन पैटर्न के बारे में अभी सीखा है। हालांकि मैं उनके बीच कोई अंतर नहीं देख सका। वे समान रूप से ठोस वर्ग बनाते हुए समान ही ध्वनि की तरह लगते हैं। क्या कोई मुझे इस संदेह को मारने में मदद कर सकता है? धन्यवाद (पैटर्न रणनीति, आगंतुक और टेम्पलेट विधि के बीच क्या अंतर है?

उत्तर

24

आगंतुक, रणनीति और टेम्पलेट पैटर्न दोनों एल्गोरिदम के अनुप्रयोग को शामिल करते हैं। सबसे बड़ा अंतर यह है कि वे कैसे विकसित होते हैं और अभ्यास में उनका उपयोग कैसे किया जाता है। हालांकि ऐसा लगता है कि उनके पास समान उपयोग केस, अंतर देखने के लिए वस्तुओं के निर्माण को देखें।

रणनीति पैटर्न अक्सर उपयोग किया जाता है जब हमारे पास प्रथम श्रेणी वस्तु के रूप में कार्य करने की क्षमता नहीं होती है। यह एक बहुत ही विशिष्ट तर्क की अपेक्षा करता है सूची और केवल उस कॉल सूची में उस तर्क सूची। उदाहरण के लिए:

struct MyStrat{ 
    void operator()(const Foo &_input){ 
     _input.up(2); 
    } 
}; 

std::for_each(myFooList.begin(), myFooList.end(), MyStrat()); 

जो टी है मुर्गी "फू" प्रकार की वस्तुओं की एक सूची पर लागू होती है। हमारे पास वास्तव में किसी भी अन्य वस्तु को लागू करने का कोई अन्य तरीका नहीं है।

दूसरी ओर विज़िटर पैटर्न का उपयोग तब किया जाता है जब हम उन ऑब्जेक्ट्स के समूह में एल्गोरिदम लागू करना चाहते हैं जो समान हस्ताक्षर साझा नहीं कर सकते हैं और न ही समान सदस्य कार्य कर सकते हैं। हम आगंतुक पैटर्न कहना क्योंकि यह अक्सर जब एक पेड़ या "असंबंधित" वस्तुओं का एक और संग्रह traversing प्रयोग किया जाता है (एक विरासत अर्थ में असंबंधित।)

struct MyVisitor{ 
    void visit(const Foo &_input){ 
     _input.up(2); 
    } 
    void visit(const Bar &_input){ 
     _input.raiseUp(2); 
    } 
    void visit(const Baz &_input){ 
     _input.setUp(2); 
    } 
}; 

यहाँ, विचार यह है कि हम चाहते हैं, उसके "ऊपर" सभी इन वस्तुओं। वे सभी एक ही सदस्य समारोह हस्ताक्षर साझा नहीं करते हैं लेकिन सभी अवधारणात्मक रूप से संबंधित हैं। इसलिए, हम इन वर्गों में से प्रत्येक "यात्रा" कर सकते हैं, लेकिन एल्गोरिदम एक ही प्रकार के कार्य करने की अपेक्षा करते हैं।

एक विज़िटर पैटर्न का उपयोग करके हम प्रत्येक वर्ग को प्रॉक्सी पैटर्न में लपेटने की आवश्यकता से बचते हैं। इसलिए, एन कक्षाओं के लिए हम इस एल्गोरिदम को लागू करना चाहते हैं, हमें एन प्रॉक्सी कक्षाएं बनाने की आवश्यकता नहीं है। हमें केवल विज़िटर क्लास में एन विधियां जोड़ने की आवश्यकता है।

टेम्पलेट विधि विज़िटर और रणनीति पैटर्न से काफी अलग है। टेम्पलेट के साथ आप जो करने की कोशिश कर रहे हैं, उसी प्रकार के एल्गोरिदम को लागू करता है लेकिन पदानुक्रम के भीतर विभिन्न उप-वर्गों पर लागू होता है। उदाहरण के लिए:

class Duck{ 
public: 
    int count() =0; 
    void makeNoise(int times) =0; 
    void quack(){ makeNoise(count()); }//the template pattern is here 
}; 

class Mallard : public Duck{ 
public: 
    int count(){ return 4; } 
    void makeNoise(cout << "quack" << endl; } 
}; 

class Daffy{ 
public: 
    int count(){ return 1; } 
    void makeNoise(cout << "Why I ought to..." << endl; } 
}; 

तो एल्गोरिदम का परिणाम विरासत में भिन्न होता है।

+0

यह अब मेरे लिए और अधिक स्पष्ट है। धन्यवाद! = D –

+0

आप व्याख्या कर सकते हैं क्यों आगंतुक करने के लिए वैकल्पिक एन प्रॉक्सी वर्गों का उपयोग किया गया था? आप एडाप्टर मतलब है, ताकि वे वर्दी इंटरफेस पड़ेगा? –

+1

@JohnLehmann हाँ, वास्तव में। आप एक एडाप्टर पैटर्न का उपयोग करने के लिए कक्षाओं की एक किस्म के लिए एक एकल रणनीति पैटर्न का उपयोग करने में सक्षम होना होगा। – wheaties

1

समानताएं:

  1. रणनीति, टेम्पलेट विधि और आगंतुक: सभी तीन पैटर्न व्यवहारिक प्रतिरूप के रूप में वर्गीकृत कर रहे हैं।

अंतर:

  1. खाका विधि विरासत का उपयोग करता है और रणनीति रचना
  2. खाका विधि आधार वर्ग द्वारा कार्यान्वित ओवरराइड नहीं किया जाना चाहिए उपयोग करता है।इस तरह, एल्गोरिथ्म की संरचना सुपर वर्ग द्वारा नियंत्रित किया जाता है, और जानकारी के उप वर्गों
  3. रणनीति एक अंतरफलक के पीछे एल्गोरिथ्म समाहित है, जो हमें रन पर एल्गोरिथ्म को बदलने की क्षमता प्रदान करते हैं में लागू किया जाता है समय
  4. आगंतुक पैटर्न वस्तुओं की इसी तरह के एक समूह पर एक कार्रवाई करने के लिए प्रयोग किया जाता है। विज़िटर पैटर्न की सहायता से, हम ऑब्जेक्ट्स से ऑपरेशन लॉजिक को अन्य क्लास
  5. पर ले जा सकते हैं यदि ऑपरेशन के कार्यान्वयन में कोई बदलाव है, तो हमें अन्य सभी ऑब्जेक्ट्स को छूने के बजाय विज़िटर क्लास बदलना होगा।

बेहतर समझ के लिए Template method, Strategy और Visitor और Sourcemaking लेख पर एक नज़र डालें।

संबंधित पोस्ट:

When should I use the Visitor Design Pattern?

Real World Example of the Strategy Pattern

Template design pattern in JDK, could not find a method defining set of methods to be executed in order