मैं सोच रहा था कि ऐसा क्या है जो अन्य समान निर्माणों की तुलना में Iterator को विशेष बनाता है, और इसने गैंग ऑफ़ फोर को एक डिज़ाइन पैटर्न के रूप में सूचीबद्ध किया।
Iterator बहुरूपता (एक सामान्य इंटरफ़ेस के साथ संग्रह का एक पदानुक्रम) और चिंताओं को अलग करने पर आधारित है (संग्रह से अधिक डेटा को संरचित करने के तरीके से स्वतंत्र होना चाहिए)।
लेकिन क्या होगा अगर हम संग्रह की पदानुक्रम को प्रतिस्थापित करते हैं, उदाहरण के लिए, गणितीय वस्तुओं की एक पदानुक्रम (पूर्णांक, फ्लोट, जटिल, मैट्रिक्स आदि) और इन वस्तुओं पर कुछ संबंधित कार्यों का प्रतिनिधित्व करने वाले वर्ग द्वारा पुनरावृत्ति, उदाहरण के लिए शक्ति कार्यों के लिए। वर्ग आरेख समान होगा।
हम शायद लेखक, पेंटर, एनकोडर, और शायद बेहतर वाले जैसे कई और समान उदाहरण पा सकते हैं, जो उसी तरह काम करते हैं। हालाँकि मैंने इनमें से किसी को भी डिज़ाइन पैटर्न कहा जा रहा है।
तो क्या Iterator खास बनाता है?
क्या यह तथ्य है कि यह अधिक जटिल है क्योंकि इसे संग्रह के भीतर वर्तमान स्थिति को संग्रहीत करने के लिए परस्पर अवस्था की आवश्यकता होती है? लेकिन फिर, उत्परिवर्तनीय स्थिति को आमतौर पर वांछनीय नहीं माना जाता है।
अपनी बात स्पष्ट करने के लिए, मुझे एक और विस्तृत उदाहरण देना चाहिए।
यहाँ हमारे डिजाइन समस्या है:
मान लीजिए कि हमारे पास कक्षाओं का एक पदानुक्रम है और इन कक्षाओं की वस्तुओं पर परिभाषित एक ऑपरेशन है। इस ऑपरेशन का इंटरफ़ेस प्रत्येक वर्ग के लिए समान है, लेकिन कार्यान्वयन पूरी तरह से अलग हो सकते हैं। यह भी माना जाता है कि एक ही ऑब्जेक्ट पर कई बार ऑपरेशन को लागू करने के लिए समझ में आता है, विभिन्न मापदंडों के साथ कहें।
हमारी डिजाइन समस्या के लिए एक समझदार समाधान (व्यावहारिक रूप से पुनरावृत्त पैटर्न का सामान्यीकरण):
चिंताओं को अलग करने के लिए, ऑपरेशन के कार्यान्वयन को मूल वर्ग पदानुक्रम (ऑपरेंड ऑब्जेक्ट) के कार्यों के रूप में नहीं जोड़ा जाना चाहिए। चूंकि हम एक ही ऑपरेंड पर कई बार ऑपरेशन को लागू करना चाहते हैं, इसलिए इसे केवल एक फ़ंक्शन द्वारा नहीं, बल्कि ऑपरेंड के संदर्भ में एक ऑब्जेक्ट द्वारा दर्शाया जाना चाहिए। इसलिए ऑपरैंड ऑब्जेक्ट को एक फ़ंक्शन प्रदान करना चाहिए जो ऑपरेशन का प्रतिनिधित्व करने वाले ऑब्जेक्ट को वापस करता है। यह ऑब्जेक्ट एक फ़ंक्शन प्रदान करता है जो वास्तविक ऑपरेशन करता है।
एक उदाहरण:
MathObject
व्युत्पन्न वर्गों के साथ एक आधार वर्ग या इंटरफ़ेस (बेवकूफ नाम है, मुझे पता है, शायद किसी को बेहतर विचार है।) MyInteger
और MyMatrix
। प्रत्येक के लिए MathObject
एक ऑपरेशन Power
परिभाषित किया जाना चाहिए जो वर्ग, घन और इसी तरह की गणना की अनुमति देता है। तो हम (जावा में) लिख सकते हैं:
MathObject i = new MyInteger(5);
Power powerOfFive = i.getPower();
MyInteger square = powerOfFive.calculate(2); // should return 25
MyInteger cube = powerOfFive.calculate(3); // should return 125