टेम्पलेट विधि और रणनीति पैटर्न के बीच अंतर क्या है?


161

क्या कोई कृपया मुझे समझा सकता है कि टेम्पलेट विधि पैटर्न और रणनीति पैटर्न में क्या अंतर है?

जहां तक ​​मैं बता सकता हूं कि वे 99% समान हैं - एकमात्र अंतर यह है कि टेम्पलेट विधि पैटर्न में आधार वर्ग के रूप में एक सार वर्ग है जबकि रणनीति वर्ग एक इंटरफ़ेस का उपयोग करता है जिसे प्रत्येक ठोस रणनीति वर्ग द्वारा लागू किया जाता है।

हालाँकि, जहाँ तक ग्राहक का सवाल है, वे बिलकुल उसी तरह से खाये जाते हैं - क्या यह सही है?


2
SO में इस पोस्ट का उसी प्रश्न के लिए बेहतर उत्तर है: stackoverflow.com/questions/464524/…
Gob00st

12
सवाल gob00st से जुड़ा है, रणनीति और पुल के बीच अंतर है। यह इस सवाल का जवाब नहीं है।
ब्लूकीज

जवाबों:


135

दोनों के बीच मुख्य अंतर तब होता है जब कंक्रीट एल्गोरिदम चुना जाता है।

टेम्पलेट विधि पैटर्न के साथ यह टेम्पलेट को उप - वर्ग करके संकलन-समय पर होता है । प्रत्येक उपवर्ग टेम्पलेट के अमूर्त तरीकों को लागू करके एक अलग कंक्रीट एल्गोरिथ्म प्रदान करता है। जब कोई क्लाइंट टेम्प्लेट के बाहरी इंटरफ़ेस के तरीकों को आमंत्रित करता है, तो टेम्प्लेट अपने अमूर्त तरीकों (इसके आंतरिक इंटरफ़ेस) को एल्गोरिथ्म को लागू करने के लिए आवश्यक कहता है।

class ConcreteAlgorithm : AbstractTemplate
{
    void DoAlgorithm(int datum) {...}
}

class AbstractTemplate
{
    void run(int datum) { DoAlgorithm(datum); }

    virtual void DoAlgorithm() = 0; // abstract
}

इसके विपरीत, रणनीति पैटर्न एक एल्गोरिथ्म पर चुना जा करने की अनुमति देता क्रम से रोकथाम । कंक्रीट एल्गोरिदम को अलग-अलग वर्गों या कार्यों द्वारा कार्यान्वित किया जाता है जो कि इसके निर्माता या एक सेटर विधि के पैरामीटर के रूप में रणनीति के लिए पारित किए जाते हैं। इस पैरामीटर के लिए कौन सा एल्गोरिदम चुना गया है, यह प्रोग्राम की स्थिति या इनपुट के आधार पर गतिशील रूप से भिन्न हो सकता है।

class ConcreteAlgorithm : IAlgorithm
{
    void DoAlgorithm(int datum) {...}
}

class Strategy
{
    Strategy(IAlgorithm algo) {...}

    void run(int datum) { this->algo.DoAlgorithm(datum); }
}

संक्षेप में:

  • टेम्पलेट विधि पैटर्न: उप -समय द्वारा संकलन-समय एल्गोरिथ्म चयन
  • रणनीति पैटर्न: रन-टाइम एल्गोरिथ्म द्वारा चयन रोकथाम

47
दोनों पैटर्न उपयोग किए गए एल्गोरिथम के रनटाइम चयन का समर्थन करते हैं (खाका विधि के लिए, आप कुछ ऐसा करेंगे if (config.useAlgoA) impl = new AlgoA() else impl = new AlgoB()) तो यह उत्तर गलत है।
बोरक बर्नार्ड

13
सुनिश्चित करें कि आप ऐसा कर सकते हैं लेकिन फिर आप टेम्पलेट पैटर्न का उपयोग नहीं कर रहे हैं। वास्तव में, यह लगभग वही है जो रणनीति उदाहरण बनाने वाला कोड जैसा दिखेगा!
thehouse

21
-1, मुझे लगता है कि यह उत्तर (हालांकि पूरी तरह से गलत नहीं है), उस बिंदु को याद करता है जहां वास्तविक अंतर हैं। @ tvanfosson का जवाब ज्यादा बेहतर है।
डॉक ब्राउन

1
@Karoly Nyisztor वे दोनों "व्यवहार को बदल सकते हैं" और "विस्तार बिंदु प्रदान करते हैं।" किसी चीज का व्यवहार या विस्तार, यह वास्तव में इस संदर्भ तक है कि आप दिए गए पैटर्न को कहां लागू करते हैं। आप टेम्पलेट विधि पैटर्न के प्रत्येक उपवर्ग को "रणनीति" भी कह सकते हैं, या रणनीति पैटर्न में प्रत्येक रणनीति वर्ग को "एक्सटेंशन" कह सकते हैं, यह सिर्फ शब्दांकन है। इस तथ्य का तथ्य यह है कि वे वही करते हैं जो इस अंतर का उल्लेख करते हैं कि इस उत्तर में उल्लेख है। तो यह सही जवाब है।
एंडी

1
एक ठोस एल्गोरिथ्म दोनों पैटर्न के लिए एक ही रास्ता चुना जाता है। चुनाव new ConcreteAlgorithm1()बनाम बनाकर किया जाता है new ConcreteAlgorithm2()। जाहिर है कि विकल्प रनटाइम पर होता है (संकलन समय पर एक एल्गोरिथ्म विकल्प बनाने का मतलब होगा कि यह हार्ड-कोडिंग है)। दोनों के बीच मुख्य अंतर यह है कि कंक्रीट एल्गोरिदम कैसे लागू किया जाता है। क्या यह एक उपवर्ग के रूप में या एक अलग इंटरफ़ेस के रूप में लागू किया गया है? पूर्व एक टेम्पलेट है। उत्तरार्द्ध एक रणनीति है। अंतर को रचना बनाम वंशानुक्रम के रूप में संक्षेपित किया जा सकता है, जो कि गोफ पुस्तक का एक सामान्य विषय है।
jaco0646

138

टेम्प्लेट पैटर्न का उपयोग तब किया जाता है जब किसी विशेष ऑपरेशन में कुछ अपरिवर्तनीय व्यवहार (एस) होते हैं जिन्हें अन्य अलग-अलग आदिम व्यवहारों के संदर्भ में परिभाषित किया जा सकता है। अमूर्त वर्ग अपरिवर्तनीय व्यवहार (ओं) को परिभाषित करता है, जबकि कार्यान्वयन वर्गों ने आश्रित विधियों को परिभाषित किया।

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

दो पैटर्न आसानी से एक साथ इस्तेमाल किया जा सकता है। आपके पास एक रणनीति पैटर्न हो सकता है जहां कई कार्यान्वयन टेम्पलेट पैटर्न का उपयोग करके कार्यान्वित रणनीतियों के परिवार से संबंधित हैं।


यह मेरे लिए सही लगता है, हालांकि विकीपीडिया का उल्लेख क्यों है कि "रणनीति का पैटर्न एक एल्गोरिथ्म के व्यवहार के लिए है जो रनटाइम में चुना जाना है"? यह भी टेम्पलेट विधि की तरह, संकलन समय पर एल्गोरिदम के व्यवहार का चयन करने के लिए इस्तेमाल किया जा सकता है? क्या मैं कुछ भूल रहा हूँ?
बॉर्नटोड कोड

2
@BornToCode मुझे लगता है कि वे जिस बारे में बात कर रहे हैं वह रन समय में एक विशेष रणनीति चुन रहा है। उदाहरण के लिए, एक समीकरण की जड़ों को संख्यात्मक रूप से खोजने के कई तरीके हैं। समस्या डोमेन या डेटा के आधार पर आप समीकरण को हल करने के लिए न्यूटन-राफसन, यूलर, या कुछ अन्य रणनीति चुन सकते हैं। उनमें से हर एक एक रणनीति है। बड़ा एल्गोरिथ्म, जिसमें से समीकरण को हल करना एक हिस्सा है, समस्या की कुछ गुणवत्ता के आधार पर नियोजित करने की रणनीति चुनता है।
tvanfosson

हां, लेकिन यह ऐसा नहीं है कि केवल उन मामलों के लिए रणनीति पैटर्न का उपयोग किया जाना चाहिए? मेरा मतलब है कि अगर मुझे संकलन के समय एल्गोरिथ्म के व्यवहार का चयन करने की आवश्यकता है, तो क्या मुझे अभी भी रणनीति पैटर्न का उपयोग करना चाहिए, या इसका उस तरह से उपयोग करने का मतलब नहीं था?
बॉर्नटोड कोड

1
@BornToCode मैं यह कहूंगा कि पसंद के गतिशील होने पर एक रणनीति सबसे उपयोगी होती है। टेम्पलेट मूल रूप से ज्ञात के लिए विभिन्न, संबंधित व्यवहारों के निर्माण का एक तरीका है। रोजगार के लिए किस टेम्पर्ड व्यवहार को चुनने के लिए आप कुछ रणनीति (हालांकि आवश्यक नहीं कि रणनीति पैटर्न) का उपयोग करेंगे। उदाहरण के लिए, उत्पाद उत्तराधिकार - आप एक आधार उत्पाद बनाएंगे, विभिन्न उत्पादों के लिए सुविधाएँ जोड़ें। कौन से उत्पाद प्रकार (वर्ग) को तुरंत चुनना यह निर्भर करता है कि यह किस तालिका / दृश्य से लोड किया गया है। रणनीति पैटर्न वास्तव में वहाँ खेलने में नहीं आता है।
तवानफोसन

2
@BornToCode यह / या बात नहीं है, यह हाँ-और है। जहाँ यह उपयुक्त है, वहाँ पैटर्न लागू करें, जहाँ यह उपयोगी है, वहाँ पैटर्न संयोजित करें।
तवान्फोसन

26

मुझे लगता है कि दोनों पैटर्न के क्लास-डायग्राम अंतर दिखा रहे हैं।

रणनीति छवि के
वर्ग लिंक के अंदर एक एल्गोरिथ्म
को एन्क्रिप्ट करती है यहां छवि विवरण दर्ज करें

टेम्प्लेट विधि
एल्गोरिदम के सटीक चरणों को छवि के उप- लिंक से कनेक्ट
करें यहां छवि विवरण दर्ज करें


24

आप शायद टेम्पलेट विधि पैटर्न का मतलब है। आप सही हैं, वे बहुत समान आवश्यकताओं की सेवा करते हैं। मैं कहूंगा कि ऐसे मामलों में टेम्पलेट पद्धति का उपयोग करना बेहतर है जब आपके पास "टेम्पलेट" एल्गोरिथ्म है जिसमें परिभाषित चरण होते हैं जहां उप-वर्ग कुछ विवरणों को बदलने के लिए इन चरणों को ओवरराइड करते हैं। रणनीति के मामले में, आपको एक इंटरफ़ेस बनाने की आवश्यकता है, और विरासत के बजाय आप प्रतिनिधिमंडल का उपयोग कर रहे हैं। मैं कहूंगा कि यह थोड़ा अधिक शक्तिशाली पैटर्न है और शायद डीआईपी - निर्भरता उलटा सिद्धांतों के अनुसार बेहतर है। यह अधिक शक्तिशाली है क्योंकि आप स्पष्ट रूप से रणनीति के एक नए अमूर्त को परिभाषित करते हैं - कुछ करने का एक तरीका, जो टेम्पलेट पद्धति पर लागू नहीं होता है। तो, अगर यह अमूर्त समझ में आता है - इसका उपयोग करें। हालांकि, टेम्पलेट विधि का उपयोग करने से आपको सरल मामलों में सरल डिजाइन मिल सकते हैं, जो महत्वपूर्ण भी है। विचार करें कि कौन से शब्द बेहतर हैं: क्या आपके पास टेम्पलेट एल्गोरिथम है? या यहाँ महत्वपूर्ण बात यह है कि आपके पास रणनीति का एक अमूर्त हिस्सा है - कुछ करने का नया तरीका

एक टेम्पलेट विधि का उदाहरण:

Application.main()
{
Init();
Run();
Done();
}

यहां आपको एप्लिकेशन से विरासत में मिला है और विकल्प है कि वास्तव में इनिट, रन और किया पर क्या किया जाएगा।

एक रणनीति का उदाहरण:

array.sort (IComparer<T> comparer)

यहाँ, जब आप एक तुलना लिख ​​रहे हैं, तो आपको एक सरणी से विरासत में नहीं मिलता है। ऐरे तुलना करने वाले एल्गोरिथ्म को एक तुलनाकर्ता को दर्शाता है।


3
मुझे लगता है कि यह एक महान जवाब है
कैलनस

23

रणनीति और टेम्पलेट विधि पैटर्न रणनीति बनाम टेम्पलेट विधि के बीच अंतर


समानताएँ

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


मतभेद

इन दो पैटर्नों का अध्ययन करते समय मैंने कुछ अंतर देखे हैं:

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

छवि को काटे गए ब्लॉग से लिया गया है ।


19

एकत्रीकरण बनाम एकत्रीकरण (ए-ए बनाम है-ए)। यह एक ही लक्ष्य को प्राप्त करने के दो तरीके हैं।

यह सवाल विकल्पों में से कुछ व्यापार-नापसंद को दर्शाता है: विरासत बनाम एकत्रीकरण


11

दोनों बहुत समान हैं, और दोनों को ग्राहक कोड द्वारा समान तरीकों से खपत किया जाता है। उपरोक्त सबसे लोकप्रिय उत्तर के विपरीत, दोनों रन-टाइम पर एल्गोरिथम चयन की अनुमति देते हैं

दोनों के बीच का अंतर यह है कि जबकि रणनीति पैटर्न विभिन्न कार्यान्वयन को वांछित परिणाम प्राप्त करने के पूरी तरह से अलग-अलग तरीकों का उपयोग करने की अनुमति देता है, टेम्पलेट विधि पैटर्न एक ओवररचिंग एल्गोरिथ्म ("टेम्पलेट" विधि) को निर्दिष्ट करता है जिसका उपयोग परिणाम प्राप्त करने के लिए किया जाता है - - विशिष्ट कार्यान्वयन (उप-वर्ग) के लिए एकमात्र विकल्प बचे हुए हैं, जो उक्त टेम्पलेट विधि के कुछ विवरण हैं। यह टेम्प्लेट विधि एक या एक से अधिक अमूर्त विधियों को कॉल करने (ओं) के द्वारा किया जाता है, जो उप-वर्गों द्वारा ओवरराइड (यानी कार्यान्वित) किए जाते हैं, टेम्प्लेट विधि के विपरीत जो स्वयं अमूर्त नहीं है और उप-वर्गों द्वारा ओवरराइड नहीं होती है ।

क्लाइंट कोड एक ठोस उप वर्गों के एक उदाहरण की ओर इशारा करते हुए अमूर्त वर्ग प्रकार के एक संदर्भ / पॉइंटर का उपयोग करके टेम्पलेट विधि के लिए एक कॉल करता है जिसे रणनीति पैटर्न का उपयोग करते समय रन टाइम पर निर्धारित किया जा सकता है।


9

खाका विधि:

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

Template_method संरचना:

यहां छवि विवरण दर्ज करें

रणनीति:

  1. यह प्रतिनिधिमंडल / रचना पर आधारित है
  2. यह विधि व्यवहार को संशोधित करके ऑब्जेक्ट के हिम्मत को बदलता है
  3. इसका उपयोग एल्गोरिदम के परिवार के बीच स्विच करने के लिए किया जाता है
  4. यह रन टाइम पर ऑब्जेक्ट के व्यवहार को पूरी तरह से बदल देता है और एक एल्गोरिथ्म को रन टाइम पर अन्य एल्गोरिदम से बदल देता है
  5. रनिंग टाइम पर बाइंडिंग की जाती है

रणनीति संरचना:

यहां छवि विवरण दर्ज करें

बेहतर समझ के लिए खाका विधि और रणनीति लेख पर एक नज़र है ।

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

JDK में टेम्प्लेट डिज़ाइन पैटर्न, क्रम में निष्पादित की जाने वाली विधियों के सेट को परिभाषित करने वाली विधि नहीं खोज सका

रणनीति पैटर्न का वास्तविक विश्व उदाहरण


3

नहीं, वे जरूरी नहीं कि उसी तरह से सेवन किए जाएं। "टेम्पलेट विधि" पैटर्न भविष्य के कार्यान्वयनकर्ताओं को "मार्गदर्शन" प्रदान करने का एक तरीका है। आप उन्हें बता रहे हैं, "सभी व्यक्ति वस्तुओं में एक सामाजिक सुरक्षा संख्या होनी चाहिए" (यह एक तुच्छ उदाहरण है लेकिन यह सही ढंग से विचार प्राप्त करता है)।

रणनीति पैटर्न कई संभावित कार्यान्वयन को अंदर और बाहर स्विच करने की अनुमति देता है। यह (आमतौर पर) विरासत के माध्यम से लागू नहीं किया जाता है, बल्कि इसके बजाय कॉल करने वाले को वांछित कार्यान्वयन में पास कर देता है। एक उदाहरण के लिए एक नौवहन कर के कई तरीकों (एक NoSalesTax कार्यान्वयन, और एक PercentageBasedSalesTax कार्यान्वयन शायद) के साथ प्रदान किया जा सकता है।

तो, कभी-कभी, ग्राहक वास्तव में उस वस्तु को बताएगा जो उपयोग करने की रणनीति है। जैसे की

myShippingCalculator.CalculateTaxes(myCaliforniaSalesTaxImpl);

लेकिन ग्राहक ऐसा कभी नहीं करेगा जो कि टेम्पलेट विधि पर आधारित है। वास्तव में, क्लाइंट को यह भी नहीं पता होगा कि कोई टेम्प्लेट विधि पर आधारित है। टेम्प्लेट मेथड पैटर्न में उन अमूर्त विधियों को संरक्षित किया जा सकता है, जिस स्थिति में क्लाइंट को पता भी नहीं होगा कि वे मौजूद हैं।


3

मैं आपको इस लेख को पढ़ने का सुझाव दूंगा। यह एक वास्तविक मामले के उदाहरण पर मतभेदों की व्याख्या करता है।

लेख से उद्धरण

" जैसा कि कोई देख सकता है कि कार्यान्वयन कक्षाएं टेम्पलेट विधि वर्ग पर भी निर्भर करती हैं। यह निर्भरता टेम्पलेट विधि को बदलने का कारण बनती है यदि कोई एल्गोरिदम के कुछ चरणों को बदलना चाहता है। दूसरी तरफ रणनीति एल्गोरिदम को पूरी तरह से एन्क्रिप्ट कर देती है। यह कार्यान्वयन प्रदान करता है। एल्गोरिदम को पूरी तरह से परिभाषित करने के लिए कक्षाएं। इसलिए यदि कोई परिवर्तन आता है, तो पहले लिखित कक्षाओं के लिए कोड को बदलने की आवश्यकता होती है। यह प्राथमिक कारण था कि मैं कक्षाओं को डिजाइन करने के लिए रणनीति चुनता हूं।

टेम्पलेट विधि की एक विशेषता यह है कि टेम्पलेट विधि एल्गोरिथ्म को नियंत्रित करती है। जो अन्य स्थिति में एक अच्छी बात हो सकती है लेकिन मेरी समस्या में यह मुझे कक्षाओं को डिजाइन करने के लिए प्रतिबंधित कर रहा है। दूसरी तरफ रणनीति एक एल्गोरिथ्म के चरणों को नियंत्रित नहीं करती है जो मुझे पूरी तरह से अलग रूपांतरण विधियों को जोड़ने में सक्षम बनाती है। इसलिए मेरे मामले में रणनीति मुझे कार्यान्वयन के लिए मदद करती है।

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

रणनीति रन-टाइम पर एल्गोरिथ्म को बदलने की भी अनुमति देती है। टेम्पलेट विधि में किसी को ऑब्जेक्ट को फिर से इनिशियलाइज़ करना होगा। रणनीति की यह विशेषता बड़ी मात्रा में लचीलापन प्रदान करती है। डिजाइन के दृष्टिकोण से किसी को विरासत पर रचना पसंद करनी होगी। इसलिए रणनीति पैटर्न का उपयोग करना भी विकास की प्राथमिक पसंद बन गया। ”


2

टेम्पलेट पैटर्न रणनीति पैटर्न के समान है। ये दो पैटर्न स्कोप और कार्यप्रणाली में भिन्न हैं।

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

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

से http://cyruscrypt.blogspot.com/2005/07/template-vs-strategy-patterns.html


2

रणनीति पैटर्न में उपवर्ग शो चला रहे हैं और वे एल्गोरिथ्म को नियंत्रित करते हैं। यहां उपवर्गों में कोड डुप्लिकेट किया गया है। एल्गोरिथ्म का ज्ञान और इसे कैसे लागू किया जाए यह कई वर्गों में वितरित किया जाता है।

टेम्पलेट पैटर्न में, बेस क्लास में एल्गोरिदम है। यह उपवर्गों के बीच पुन: उपयोग को अधिकतम करता है। चूंकि एल्गोरिथ्म एक ही स्थान पर है, इसलिए बेस क्लास इसे सुरक्षित रखता है।


2

रणनीति डिजाइन पैटर्न

  • रचना का समर्थन करता है।
  • रनटाइम पर ऑब्जेक्ट के व्यवहार को बदलने के लिए आपको लचीलापन प्रदान करता है।
  • क्लाइंट कोड और समाधान / एल्गोरिदम कोड के बीच कम युग्मन।

खाका विधि डिजाइन पैटर्न

  • रचना पर विरासत के पक्षधर हैं
  • अपने बेस क्लास में एल्गोरिथ्म को परिभाषित करें। एल्गोरिथ्म के व्यक्तिगत टुकड़ों को बाल कक्षाओं में अनुकूलित किया जा सकता है।

1

टेम्पलेट पैटर्न:

टेम्पलेट पद्धति उपवर्गों को आधार वर्ग में परिभाषित एल्गोरिथ्म की मुख्य संरचना और चरणों को बदलने के बिना, एल्गोरिदम के कुछ चरणों को फिर से परिभाषित करने के बारे में है। टेम्प्लेट पैटर्न आमतौर पर वंशानुक्रम का उपयोग करता है, इसलिए एल्गोरिदम का एक सामान्य कार्यान्वयन बेस क्लास में प्रदान किया जा सकता है, जिसे उप-वर्ग जरूरत पड़ने पर ओवरराइड कर सकता है।

public abstract class RobotTemplate {
    /* This method can be overridden by a subclass if required */
    public void start() {
        System.out.println("Starting....");
    }

    /* This method can be overridden by a subclass if required */
    public void getParts() {
        System.out.println("Getting parts....");
    }

    /* This method can be overridden by a subclass if required */
    public void assemble() {
        System.out.println("Assembling....");
    }

    /* This method can be overridden by a subclass if required */
    public void test() {
        System.out.println("Testing....");
    }

    /* This method can be overridden by a subclass if required */
    public void stop() {
        System.out.println("Stopping....");
    }

    /*
     * Template algorithm method made up of multiple steps, whose structure and
     * order of steps will not be changed by subclasses.
     */
    public final void go() {
        start();
        getParts();
        assemble();
        test();
        stop();
    }
}


/* Concrete subclass overrides template step methods as required for its use */
public class CookieRobot extends RobotTemplate {
    private String name;

    public CookieRobot(String n) {
        name = n;
    }

    @Override
    public void getParts() {
        System.out.println("Getting a flour and sugar....");
    }

    @Override
    public void assemble() {
        System.out.println("Baking a cookie....");
    }

    @Override
    public void test() {
        System.out.println("Crunching a cookie....");
    }

    public String getName() {
        return name;
    }
}

उपरोक्त कोड में ध्यान दें, गो () एल्गोरिदम चरण हमेशा एक ही होगा, लेकिन उप-वर्ग एक विशेष चरण को निष्पादित करने के लिए एक अलग नुस्खा परिभाषित कर सकते हैं।

रणनीति पैटर्न:

रणनीति पैटर्न क्लाइंट को रनटाइम पर ठोस एल्गोरिदम के कार्यान्वयन के बारे में बताता है। सभी एल्गोरिदम पृथक और स्वतंत्र हैं, लेकिन एक सामान्य इंटरफ़ेस लागू करते हैं, और एल्गोरिथ्म के भीतर विशेष चरणों को परिभाषित करने की कोई धारणा नहीं है।

/**
 * This Strategy interface is implemented by all concrete objects representing an
 * algorithm(strategy), which lets us define a family of algorithms.
 */
public interface Logging {
    void write(String message);
}

/**
 * Concrete strategy class representing a particular algorithm.
 */
public class ConsoleLogging implements Logging {

    @Override
    public void write(String message) {
        System.out.println(message); 
    }

}

/**
 * Concrete strategy class representing a particular algorithm.
 */
public class FileLogging implements Logging {

    private final File toWrite;

    public FileLogging(final File toWrite) {
        this.toWrite = toWrite;
    }

    @Override
    public void write(String message) {
        try {
            final FileWriter fos = new FileWriter(toWrite);
            fos.write(message);
            fos.close();
        } catch (IOException e) {
            System.out.println(e);
        }
    }

}

पूर्ण स्रोत कोड के लिए, मेरे गिथब भंडार को देखें


0

रणनीति को सार वर्ग के रूप में एक इंटरफ़ेस और टेम्पलेट विधि के रूप में उजागर किया गया है। यह आमतौर पर चौखटे में बहुत उपयोग किया जाता है। उदाहरण के लिए, स्प्रिंग फ्रेमवर्क का संदेश स्रोत वर्ग संदेशों को सुलझाने के लिए एक रणनीति इंटरफ़ेस है। क्लाइंट इस इंटरफ़ेस के विशेष कार्यान्वयन (रणनीति) का उपयोग करता है।

और एक ही इंटरफ़ेस के अमूर्त कार्यान्वयन AbstractMessageSource, जिसमें संदेशों को हल करने का सामान्य कार्यान्वयन है और यह समाधान () सार विधि को उजागर करता है ताकि उप-वर्ग उन्हें अपने तरीकों से लागू कर सकें। AbstractMessageSource टेम्पलेट पद्धति का एक उदाहरण है।

http://docs.spring.io/spring/docs/4.1.7.RELEASE/javadoc-api/org/springframework/context/support/AbstractMessageSource.html


0

इस डिज़ाइन पैटर्न के टेम्प्लेट विधि में, उपवर्गों द्वारा एक या एक से अधिक एल्गोरिथ्म चरणों को ओवरराइड किया जा सकता है, ताकि अलग-अलग व्यवहारों को सुनिश्चित करने की अनुमति दी जा सके कि ओवररचिंग एल्गोरिथ्म का अभी भी पालन किया जाता है (विकी)।

पैटर्न नाम टेम्पलेट विधि का अर्थ है कि यह क्या है। मान लें कि हमारे पास एक विधि CalculateSomething () है और हम इस विधि को टेम्पलेट देना चाहते हैं। इस विधि को आधार वर्ग में एक गैर आभासी विधि के रूप में घोषित किया जाएगा। कहो विधि इस तरह दिखती है।

CalculateSomething(){
    int i = 0;
    i = Step1(i);
    i++;
    if (i> 10) i = 5;
    i = Step2(i);
    return i;

} Step1 और Step2 मेथड इम्प्लीमेंटेशन व्युत्पन्न वर्गों द्वारा दिया जा सकता है।

रणनीति पैटर्न में आधार द्वारा कोई कार्यान्वयन प्रदान नहीं किया गया है (यही कारण है कि आधार वास्तव में वर्ग आरेख में एक इंटरफ़ेस है)

क्लासिक उदाहरण छँट रहा है। वस्तुओं की संख्या के आधार पर उपयुक्त एल्गोरिथ्म वर्ग (मर्ज, बबल, क्विक आदि) को बनाने की आवश्यकता होती है और बनाया जाता है और पूरे एल्गोरिथ्म को प्रत्येक कक्षा में समझाया जाता है।

अब क्या हम छँटाई को एक टेम्पलेट विधि के रूप में लागू कर सकते हैं? निश्चित रूप से आप कर सकते हैं, लेकिन आप बहुत कुछ / किसी भी समानता को अमूर्त नहीं पाते हैं और आधार कार्यान्वयन में रखा जाता है। तो यह टेम्पलेट विधि पैटर्न के उद्देश्य को पराजित करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.