Ali Shobeyri
Ali Shobeyri
خواندن ۴ دقیقه·۴ سال پیش

الگویِ طراحیِ Iterator (جاوا و کاتلین)

مسلما با حلقه for آشنایید (مگه میشه نباشید ؟) شما در for یک لیست/آرایه رو iterate می‌کنید ، برای همین براش یه "i" تعریف می‌‎کنید ، این i از کلمه iterate (یا index) میاد ، iterate در لغت به معنی "تکرار" و Iterator برای شما یک حلقه رو تکرار می‌کنه ، الگویِ Iterator هم بر همین اساسه .

حالا چرا باید برای همچین مساله‌ای یک الگویِ جدید طراحی کنند ؟ مگه خودِ for چشه ؟ مساله به ساختارِ لیستِ شما برمی‌گرده ، شاید آرایه باشه ، شاید لیست باشه ، شاید درخت باشه یا ... ، مسلما برای درخت نمی‌تونید یه for خشک و خالی بنویسید ! پس این الگو به شما این امکان رو میده که برای "پیمایشِ مجموعه" تون یک کد مشخص داشته باشید ، این الگو جزء دسته Behavioral حساب میشه .


این الگو شامل چند بخش میشه :

Iterator - ConcreteIterator

در خودِ جاوا/کاتلین Iterator رو داریم و نیازی به پیاده‌سازی مجددش نیست ، در این Interface دو متد hasNext و next داریم ، اولی برای چک کردن اینکه آیا next وجود داره و دومی برای پیمایش ، ما از این Interface رو ارث می‌بریم و ConcreteIterator هامون رو می‌سازیم که توش الگوریتم مورد نظر برای دو تابع فوق رو پیاده می‌کنیم

Collection - ConcreteCollection

در Collection ما لیست یا آرایه یا ساختار مورد نظرمون رو داریم ، این Collection یک Iterator رو می‌تونه تولید کنه که جهت پیمایش در کدِ اصلی ازش استفاده بشه ، عملیات اضافه و کم و ... کردن روی مجموعه‌مون رو هم اینجا انجام میدیم ، ConcreteCollection هم مسلما پیاده‌سازی متد‌های Collection هست .

صورت مساله

فرض کنید یک درخت دودویی داریم و به حالت سطح به سطح قصد چاپ کردنِ اِلمان هاشو داریم ، قبل از شروع کد‌ها باید در نکته‌ای رو در مورد ساختار این درخت بگم ، یکی از راه‌هاش نشون دادن یک درخت با استفاده از آرایه است ، مثلا اگه اگه آرایه 7 عنصری داشته باشیم فرزند راست عنصر شماره 2 (فرض کنید آرایه از 1 شروع میشه نه 0) میشه عنصر خونه 2x2 یعنی 4 و عنصر سمت راستش میشه 2x2 + 1 که میشه عنصر شماره‌ی 5 ، وقتی شما به همچین ساختاری قصد اضافه کردن یک عنصر رو دارید به انتها اضافه می‌کنیدش و باعث میشه درخت سطح به سطح پر بشه ، به شکل دقت کنید :

ما قصد داریم سطح به سطح این درخت رو پیمایش کنیم ، پس شروع به کد می‌کنیم :

https://gist.github.com/sasssass/aab30d352ce7a09d7dc6ea9e3520c520

در جاوا interface ای به نام Iterator موجود هست که وقتی شما TreeIterator رو ازش ارث می‌برید باعث میشه دو تابع hasNext و next رو override کنید ، در hasNext ما بررسی می‌کنیم که الان در حال شمارش فرزند چپ هستیم یا راست ، calculationPos برای شمارش فرزندهای چپه و pos برای شمارش فرزند‌های راست

نکته : وقتی شما ++ رو بعد از متغیر بگذارید اول عملیات مورد نظرتون اجرا میشه و بعدش ++ ولی اگه قبل متغیر بذارید اول ++ اجرا میشه بعد عملیات

در Collection یک تابع برای ایجاد Iterator درست می‌کنیم ، و TreeCollection از اون ارث می‌بره ، برای اضافه کردن به درخت طبق توضیحی که بالاتر دادم باید به آخرین index درخت عدد رو اضافه کنید ، در کدی که از این کدها استفاده می‌کنه این طور داریم :

https://gist.github.com/sasssass/583ae762e16b15e71cc349d307acf27c

در این کد ابتدا یک آرایه خالی از صفر داریم (خالی از صفر ؟؟؟) و بعد از یک تا هفت درونش پر می‌کنیم ، بعد از اون در یک while با بررسی hasNext می‌آییم و مرتبا next رو صدا می‌زنیم ، و می‌بینیم که خروجی مورد نظر ما رو تولید می‌کنه :


باقی مقالات در مورد الگوی‌های طراحی رو در این مقاله بخونید .

من رو در لینکدین و اینستاگرام دنبال کنید ???

اگه دوست داشتید می‌تونید به صفحه Spotify بنده هم برید و موسیقی های منو گوش بدید ???


اندرویدجاواکاتلیندیزاین پترنبرنامه نویسی
برنامه نویس اندروید - https://www.linkedin.com/in/iryebohs/
شاید از این پست‌ها خوشتان بیاید