الگوی 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

 

 

  1. ۱۶ شهریور ۱۳۸۶ در ۱۰:۲۵ | #1

    سلام.خیلی خوشحالم که نوشتن را دوباره شروع کردید. به امید دیدار

  2. طاهری راد
    ۱۷ شهریور ۱۳۸۶ در ۱۵:۴۰ | #2

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

  3. ۱۷ شهریور ۱۳۸۶ در ۲۲:۳۷ | #3

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

  4. طاهری راد
    ۲۰ شهریور ۱۳۸۶ در ۱۷:۲۸ | #4

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

  5. ۲۲ شهریور ۱۳۸۶ در ۲۱:۱۶ | #5

    سلام عالیه…….فقط همین عالی…..موفق باشی

  6. بهروز
    ۱ مهر ۱۳۸۶ در ۰۸:۲۹ | #6

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

  7. آزاده
    ۲۷ شهریور ۱۳۸۷ در ۱۴:۰۸ | #7

    ممنون از مطالب مفیدتون. خیلی استفاده کردم.موفق باشید و پایدار

  8. حسین نیک پور
    ۳۱ تیر ۱۳۸۸ در ۱۴:۳۲ | #8

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

  9. محمد
    ۹ آذر ۱۳۸۹ در ۰۸:۴۹ | #9

    ممنون

  10. john
    ۱۰ آذر ۱۳۸۹ در ۰۸:۱۳ | #10

    با تشکر
    چرا از اینترفبس IEnumerable استفاده نکنیم تا بتوان توسط دستور foreach نیز از بهره ببریم؟
    این مقاله را ببینید:
    http://support.microsoft.com/kb/322022

    • ۱۰ آذر ۱۳۸۹ در ۰۸:۲۵ | #11

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

  11. ۲ دی ۱۳۸۹ در ۱۹:۱۰ | #12

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

    • ۴ دی ۱۳۸۹ در ۰۷:۰۲ | #13

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

  1. بدون بازتاب