دیزاین پترن Iterator

دیزاین پترن Iterator

Behavioral DESIGN PATTERNS

یکی از زیرشاخه های الگوهای طراحی، Behavioral Design Patterns است. تمرکز و وظیفه اصلی این دیزاین پترن ها تعامل اشیاء و جداسازی وظایف آن ها  از یکدیگر است.

Iterator Design Pattern

دیزاین پترن Iterator یکی از زیرشاخه های الگوهای طراحی از نوع Behavioral است.

الگوی طراحی Iterator راهی برای دسترسی پی در پی به عناصر یک شیء مجتمع بدون افشای نمای اصلی آن فراهم می کند.

سختش نکنیم! وقتی بخواهیم اعضای یک کالکشن (مثل لیست) را تک به تک پیمایش کنیم، این دیزاین پترن به کارمان می آید. در خیلی از کدها احتمالا این دیزاین پترن را دیده اید و از نتیجه آن استفاده کرده اید.

میزان استفاده : زیاد

پیاده سازی دیزاین پترن Iterator

فرض کنید اینترفیسی به نام IContainer داریم برای کلاس هایی که نقش نگهدارنده دیتا را برایمان دارد. به این شکل پیاده سازی میکنیم.

interface IContainer
    {
        IIterator GetIterator();
    }

اینترفیس دیگری تحت عنوان Iterator داریم جهت Iterate کردن (پیمایش) اطلاعات.

interface IIterator
    {
        bool HasNext();
        Object Next();
    }

در این اینترفیس دو متد داریم. متد HasNext که باید مشخص کند آیا دیتای دیگری در ادامه وجود دارد یا نه. فکر کنید در حال پیمایش تک به تک اطلاعات یک لیست هستیم. در مرحله فعلی که هستیم، آیا دیتایی در خانه بعدی این لیست قرار دارد که ادامه بدیم به پیمایش یا خیر؟ پاسخ این سوال را باید این متد HasNext بدهد.

متد بعدی هم Next هست که خود این دیتا را به ما میدهد.

حالا بریم سراغ مخزن نگهداری اطلاعات. همانطور که گفتم بالاتر، جایی که این اطلاعات را قرار هست نگهداری کنیم باید از اینترفیس IContainer پیروی کند.

class NameRepository : IContainer
    {
        public static string[] names = { "Robert", "John", "Julie", "Lora" };
        public IIterator GetIterator()
        {
            return new NameIterator();
        }
        private class NameIterator : IIterator
        {
            int index;
            public bool HasNext()
            {
                if (index < names.Length)
                {
                    return true;
                }
                return false;
            }

            public object Next()
            {
                if (this.HasNext())
                {
                    return names[index++];
                }
                return null;
            }
        }
    }

در کد بالا یک آرایه stringای داریم که اسامی را نگهداری میکند. متدی داریم به نام GetIterator که قرار است یک شی جدید از یک کلاس داخلی (Inner Class) برگرداند. این کلاس باید از نوع Iterator باشد.

از روی تعداد اسامی در لیست اسامی و نگهداری ایندکس (index) فعلی میتوانیم تشخیص دهیم که آیا آیتم بعدی وجود دارد یا نه و اگر وجود دارد هم میتوانیم آن را برگردانیم.

حال نوبتی هم باشد نوبت به متد main است.

static void Main(string[] args)
        {
            try
            {
                NameRepository namesRepository = new NameRepository();
                for (IIterator iter = namesRepository.GetIterator(); iter.HasNext();)
                {
                    String name = (String)iter.Next();
                    ShowSuccess($"Name : {name}");
                }
            }
            catch (Exception ex)
            {
                ShowError(ex.Message);
            }
            Console.ReadLine();
        }

در این متد یک حلقه زدیم که زمانی که HasNext نداشت دیگر ادامه پیدا نمیکند. و در هر دور حلقه یک آیتم از لیست اسامی پیمایش پیدا کرده.

برای آموزش رایگان در مورد انواع دیزاین پترن ها و معماری های نرم افزار می توانید به این آموزش مراجعه نمایید:

معماری نرم افزار مهم ترین پترن های معماری نرم افزار

دیزاین پترن یا الگوی طراحی چیست؟

دیزاین پترن  در حقیقت راه حل مسائل طراحی نرم افزار هستند که بارها و بارها در دنیای توسعه نرم افزار تکرار میشوند. الگوهایی از طراحی قابل استفاده مجدد (reusable) و تعامل اشیاء.

پرینت صفحه

هولوسن

با من یاد بگیر

آموزش های بیشتر در وبسایت هولوسن : https://holosen.net

بدون نظر

**پرسش و پاسخ** سوال خود مطرح کنید.
امتیاز شما*