تکرار کننده (Iterator)
هـــدف
الگوی طراحی تکرارگر (Iterator) الگویی رفتاری است که به شما امکان میدهد عناصر یک مجموعه را بدون نمایش ساختار درونی آن (لیست، پشته، درخت و غیره) پیمایش کنید.
مـسئـــلـه
مجموعهها یکی از پرکاربردترین انواع دادهها در برنامهنویسی هستند. با این حال، یک مجموعه فقط یک ظرف برای گروهی از اشیاء است.
اکثر مجموعهها عناصر خود را در لیستهای ساده ذخیره میکنند. با این حال، برخی از آنها بر اساس پشتهها، درختها، نمودارها و سایر ساختارهای پیچیده دادهای ساخته شدهاند.
اما صرف نظر از ساختار یک مجموعه، باید روشی برای دسترسی به عناصر آن فراهم کند تا کدهای دیگر بتوانند از این عناصر استفاده کنند. باید راهی وجود داشته باشد که بدون دسترسی مجدد به عناصر یکسان، از هر عنصر مجموعه عبور کنید.
اگر مجموعه شما بر اساس یک لیست ساخته شده باشد، این کار ممکن است آسان به نظر برسد. شما فقط روی تمام عناصر حلقه میزنید. اما چگونه عناصر یک ساختار پیچیده داده مانند یک درخت را به صورت متوالی پیمایش میکنید؟ به عنوان مثال، ممکن است یک روز با پیمایش عمقی یک درخت مشکلی نداشته باشید. اما روز بعد ممکن است به پیمایش سطحی نیاز داشته باشید. و هفته بعد، ممکن است به چیز دیگری مانند دسترسی تصادفی به عناصر درخت نیاز داشته باشید.
افزودن الگوریتمهای پیمایش بیشتر و بیشتر به مجموعه به تدریج مسئولیت اصلی آن را که ذخیره دادههای کارآمد است، محو میکند. علاوه بر این، برخی الگوریتمها ممکن است برای یک برنامه خاص تنظیم شده باشند، بنابراین قرار دادن آنها در یک کلاس مجموعه عمومی عجیب خواهد بود.
از سوی دیگر، کد مشتری که قرار است با مجموعههای مختلف کار کند ممکن است حتی به نحوه ذخیره عناصر آنها اهمیت ندهد. با این حال، از آنجایی که همه مجموعهها روشهای مختلفی برای دسترسی به عناصر خود ارائه میدهند، شما جز اتصال کد خود به کلاسهای خاص مجموعه، گزینه دیگری ندارید.
راهــکــــار
ایده اصلی الگوی تکرارگر (Iterator) این است که رفتار پیمایش یک مجموعه را به یک شیء جداگانه به نام تکرارگر منتقل کنیم.
علاوه بر پیادهسازی خود الگوریتم، یک شیء تکرارگر تمام جزئیات پیمایش، مانند موقعیت فعلی و تعداد عناصر باقیمانده تا پایان را کپسوله میکند. به همین دلیل، چندین تکرارگر میتوانند به طور همزمان و مستقل از یکدیگر از یک مجموعه عبور کنند.
معمولاً، تکرارگرها یک متد اصلی برای دریافت عناصر مجموعه ارائه میدهند. مشتری میتواند این متد را تا زمانی که چیزی برنگرداند اجرا کند، که به معنای این است که تکرارگر تمام عناصر را پیمایش کرده است.
همه تکرارگرها باید یک رابط مشترک را پیادهسازی کنند. این باعث میشود که کد مشتری با هر نوع مجموعه یا هر الگوریتم پیمایشی سازگار باشد تا زمانی که یک تکرارگر مناسب وجود داشته باشد. اگر به یک روش خاص برای پیمایش یک مجموعه نیاز دارید، فقط یک کلاس تکرارگر جدید ایجاد میکنید، بدون اینکه نیازی به تغییر مجموعه یا مشتری باشد.
مقایسه با دنیای واقعی
شما قصد دارید برای چند روز از رم دیدن کنید و تمام مکانهای دیدنی و جذاب آن را ببینید. اما وقتی آنجا هستید، ممکن است وقت زیادی را صرف قدم زدن در دایرهها کنید و حتی کولوسئوم را پیدا نکنید.
از طرف دیگر، میتوانید یک اپلیکیشن راهنمای مجازی برای گوشی هوشمند خود خریداری کنید و از آن برای ناوبری استفاده کنید. این اپلیکیشن هوشمند و ارزان است و میتوانید در مکانهای جالبی به مدت دلخواه خود بمانید.
یک گزینه سوم این است که میتوانید بخشی از بودجه سفر خود را خرج کنید و یک راهنمای محلی را استخدام کنید که شهر را مانند کف دست خود میشناسد. راهنما میتواند تور را مطابق با سلیقه شما تنظیم کند، تمام جاذبهها را به شما نشان دهد و داستانهای هیجانانگیزی برایتان تعریف کند. این حتی سرگرمکنندهتر خواهد بود؛ اما افسوس، گرانتر نیز خواهد بود.
همه این گزینهها – جهتهای تصادفی متولد شده در ذهن شما، ناوبری گوشی هوشمند یا راهنمای انسانی – به عنوان تکرارگرهایی بر روی مجموعه گسترده مکانهای دیدنی و جذاب واقع در رم عمل میکنند.
ســاخــتـــار
برای مطـالعـه متن کامل مقالــه، مجموعه کــــدها، نحوه پیاده سازی، مزایا و معایب و روابط با الگوهای دیگر، ایــنــجـــا کلیک کنید.