الگوی Iterator

یکی شی مرکب دارید، تمایل دارید اشیاء تشکیل دهنده این شی را چگونه ذخیره کنید، در یک آرایه، در یک ArrayList یا در یک ساختار دیگر. شما می توانید با توجه به علاقه و سبک کاری خود هر کدام از این ساختمان داده ها را برای اینکار استفاده کنید. اما اجازه بدهید روی مسئله را کمی تغییر دهیم، یک کلاس دیگر نیاز دارد به اشیاء موجود در این اشیاء دسترسی داشته باشد، برای اینکار حتما نیاز خواهد داشت که بداند شما اشیاء را در این شی به چه صورت ذخیره کرده اید. پس برای غلبه به این مشکل شما نیاز دارید، متدهای را توسط شی مرکب ارائه دهید که کلاس های دیگر بدون اطلاع از نحوه ذخیره شدن اشیاء، به آنها دسترسی داشته باشند.

یک مسئله دیگر را در نظر بگیرید، ما چندین شی مرکب یا لیستی از داده ها داریم، بعضی از کلاس ها نیاز دارند تا به اشیاء و داده های موجود در این اشیاء یا لیست ها دسترسی داشته باشند، آیا می توانیم طراحی خود را به صورتی ارائه دهیم که یک کلاس، به روشی مشابه به لیست اشیاء یا داده ها دسترسی داشته باشد.

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

تصور کنید که یک کتاب از چند فصل تشکیل شده است و هر فصل به عنوان یک شی در سیستم در نظر گرفته شده است، می خواهیم اسامی فصول این یک کتاب را نمایش دهیم، برای اینکار ما نیاز داریم تا به لیست فصول آن کتاب دسترسی داشته باشیم، برای اینکار ما از الگوی بالا استفاده خواهیم کرد. طبق تعریف الگوی Iterator، ما در ابتدا نیاز داریم تا یک اینترفیس برای اینکار تعریف کنیم. ما به متدهای مانند بررسی اینکه عنصری بعدی در لیست وجود دارد یا نه، برگرداندن عنصر فعلی، برگرداندن عنصر بعدی، و برگشت به عنصر اول. سپس ما نیاز داریم تا این اینترفیس را پیاده سازی کنیم.

دیاگرام الگوی Iterator

تعریف اینترفیس IIterator

Public Interface IIterator

 Function FirstItem() As Object

 Function NextItem() As Object

 Function IsDone() As Boolean

 Function CurrentItem() As Object

End Interface

 

پیاده سازی اینترفیس IIterator

Public Class ConcreteIterator

 Implements IIterator

 Private List As New ArrayList

 Private Current As Integer = 0

 

 Public Sub New(ByVal VarList As ArrayList)

 List = VarList

 End Sub

 

 Public Function CurrentItem() As Object Implements IIterator.CurrentItem

 Return List(Current)

 End Function

 

 Public Function FirstItem() As Object Implements IIterator.FirstItem

 Current = 0

 If IsDone() Then

 Return List(Current)

 Else

 Return Nothing

 End If

 End Function

 

 Public Function IsDone() As Boolean Implements IIterator.IsDone

 If Current >= List.Count Then

 Return False

 Else

 Return True

 End If

 End Function

 

 Public Function NextItem() As Object Implements IIterator.NextItem

 Current += 1

 If IsDone() Then

 Return List(Current)

 Else

 Return Nothing

 End If

 End Function

End Class

 

تعریف اینترفیس Aggregate

Public Interface IAggregate

 Function CreateIterator() As IIterator

End Interface

 

پیاده سازی اینترفیس Aggregate و کلاس Book

Public Class Book

 Implements IAggregate

 Private _Name As String

 Private _Chapters As New ArrayList

 

 Public Property Name() As String

 Get

 Return _Name

 End Get

 Set(ByVal value As String)

 _Name = value

 End Set

 End Property

 

 Public Sub New()

 

 End Sub

 

 Public Sub New(ByVal VarName As String)

 _Name = VarName

 End Sub

 

 Public Sub Add(ByVal Chapter As Chapter)

 _Chapters.Add(Chapter)

 End Sub

 

 Public Function CreateIterator() As IIterator Implements IAggregate.CreateIterator

 Return New ConcreteIterator(_Chapters)

 End Function

End Class

 

 

تعریف کلاس Chapter

Public Class Chapter

 Private _Name As String

 Public Property Name() As String

 Get

 Return _Name

 End Get

 Set(ByVal value As String)

 _Name = value

 End Set

 End Property

 Public Sub New()

 

 End Sub

 Public Sub New(ByVal VarName As String)

 _Name = VarName

 End Sub

End Class

 

نحوه استفاده

Dim Book As New Book(“Book1”)

Book.Add(New Chapter(“Chapter 1”))

Book.Add(New Chapter(“Chapter 2”))

 

Dim Iterator As IIterator = Book.CreateIterator

Dim Ins As Chapter = Iterator.FirstItem

While Iterator.IsDone

 System.Console.WriteLine(Ins.Name)

 Ins = Iterator.NextItem

End While

 

 

13 comments on “الگوی Iterator

  1. طاهری راد on

    سلاماستفاده کردیم از مطلبتون / جالب بود ادامه بده نوشتن را و سریعترالگوهای معماری نیز یادت نرهبا تشکر

  2. p30ton on

    با سلام اميدوارم به طور مداوم به روز شويد . برنامه نويسي به سرعت رو به رشد است و اگر باز هم عقب بمانبد بازديدکنندگانتان راه ديگري را براي دريافت اطلاعاتشان خواهند يافت . پستهاي کوتاهتر و جالبتر مي تواند براي ما مفيد تر نيز باشد . اگر توضيحاتي به کدهايي که نوشته ايد اظافه کنيد بسيار بهره خواهم برد . لينک شما در وبلاگ من قرار گرفت . بازهم اميدوارم يک لينک مرده نباشد . برنامه نوبسي يک کار تخصصي است و علاقمندان کمي دارد اما همين علاقمندان از کابران حرفه و متوقع اينترنت مي باشند و انتظاراتشان را هيچگاه نمي توان پاسخگو بود در عين حال ما گروه وفادار اينترنت هستيم . باز هم به شما سرميزنم.

  3. طاهری راد on

    سلاممن یه سوال دارم – آیا شئی مرکب را می توانیم پرونده پرسنلی یک شخص در نظر بگیریم.با تشکر

  4. بهروز on

    سلام آقای طاهری راددر مورد سوال شما می شود از دیدگاههای مختلف به مسئله نگاه کرد ولی می شود پرونده پرسنلی را به عنوان یک شی مرکب در نظر گرفت. اگر پرونده از اشیای دیگر تشکیل شده باشد مثلا اگر آدرس را به عنوان یکی شی دیگر در نظر بگیریم یا سابفه کاری به عنوان یکی شی دیگر در نظر گرفته شود

  5. حسین نیک پور on

    آقا خیلی عالیه فقط اگه امکانش باشه و همه مطالبو به صورت یه فایل Word یا PDF بزارین ممنون میشم

    • بهروز بختیاری on

      این پست ها مربوط به چند سال قبل هست. من اینها را اتوماتیک از بلاکفا به اینجا انتقال داده بودم نمی دانم چرا و چطوری خود وردپرس اینها را منتشر کرده.
      وقتی ما درباره الگوها صحبت می کنیم هیچ زبانی و امکانات آنرا در نظر نمی گیریم. بلکه صورت مسئله و الگوی برای حل آن را مد نظر می گیریم. ولی حرف شما نیز صحیح می باشد الان بسیاری از الگوها به صورت پیش فرض در بسیاری از زبانها پیاده سازی شده است و ما می توانیم با تشخیص الگو به صورت بسیار ساده از آن استفاده کنیم.

  6. ابوذر نوذری on

    آقای بختیاری عزیز سلام
    اتفاقا من هم تعجب کردم چون این پست ها را قبلا دیده بودم. و با توضیح پایانی شما شکم برطرف شد. به هر حال اتفاق خوبی افتاده است. بد نیست آدم بعضی وقت ها چیزهای قدیمی رو مرور و تازه کنه. من پیشنهاد می دم مطالبی که چند سال قبل در مورد الگوهای طراحی نوشتید رو به صورت مدون در قالب یک پی دی اف قابل دانلود منتشر کنید.
    راستی من نمی دونستیم وبلاگ رو منتقل کردید. لطفا در وبلاگ قبلی یک توضیحی بگذارید. آدرستون رو در وبلاگم اصلاح می کنم و به این وبلاگ لینک می دم. موفق باشید

    • بهروز بختیاری on

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

Comments are closed.