یکی شی مرکب دارید، تمایل دارید اشیاء تشکیل دهنده این شی را چگونه ذخیره کنید، در یک آرایه، در یک 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
|
سلام.خیلی خوشحالم که نوشتن را دوباره شروع کردید. به امید دیدار
سلاماستفاده کردیم از مطلبتون / جالب بود ادامه بده نوشتن را و سریعترالگوهای معماری نیز یادت نرهبا تشکر
با سلام اميدوارم به طور مداوم به روز شويد . برنامه نويسي به سرعت رو به رشد است و اگر باز هم عقب بمانبد بازديدکنندگانتان راه ديگري را براي دريافت اطلاعاتشان خواهند يافت . پستهاي کوتاهتر و جالبتر مي تواند براي ما مفيد تر نيز باشد . اگر توضيحاتي به کدهايي که نوشته ايد اظافه کنيد بسيار بهره خواهم برد . لينک شما در وبلاگ من قرار گرفت . بازهم اميدوارم يک لينک مرده نباشد . برنامه نوبسي يک کار تخصصي است و علاقمندان کمي دارد اما همين علاقمندان از کابران حرفه و متوقع اينترنت مي باشند و انتظاراتشان را هيچگاه نمي توان پاسخگو بود در عين حال ما گروه وفادار اينترنت هستيم . باز هم به شما سرميزنم.
سلاممن یه سوال دارم – آیا شئی مرکب را می توانیم پرونده پرسنلی یک شخص در نظر بگیریم.با تشکر
سلام عالیه…….فقط همین عالی…..موفق باشی
سلام آقای طاهری راددر مورد سوال شما می شود از دیدگاههای مختلف به مسئله نگاه کرد ولی می شود پرونده پرسنلی را به عنوان یک شی مرکب در نظر گرفت. اگر پرونده از اشیای دیگر تشکیل شده باشد مثلا اگر آدرس را به عنوان یکی شی دیگر در نظر بگیریم یا سابفه کاری به عنوان یکی شی دیگر در نظر گرفته شود
ممنون از مطالب مفیدتون. خیلی استفاده کردم.موفق باشید و پایدار
آقا خیلی عالیه فقط اگه امکانش باشه و همه مطالبو به صورت یه فایل Word یا PDF بزارین ممنون میشم
ممنون
با تشکر
چرا از اینترفبس IEnumerable استفاده نکنیم تا بتوان توسط دستور foreach نیز از بهره ببریم؟
این مقاله را ببینید:
http://support.microsoft.com/kb/322022
این پست ها مربوط به چند سال قبل هست. من اینها را اتوماتیک از بلاکفا به اینجا انتقال داده بودم نمی دانم چرا و چطوری خود وردپرس اینها را منتشر کرده.
وقتی ما درباره الگوها صحبت می کنیم هیچ زبانی و امکانات آنرا در نظر نمی گیریم. بلکه صورت مسئله و الگوی برای حل آن را مد نظر می گیریم. ولی حرف شما نیز صحیح می باشد الان بسیاری از الگوها به صورت پیش فرض در بسیاری از زبانها پیاده سازی شده است و ما می توانیم با تشخیص الگو به صورت بسیار ساده از آن استفاده کنیم.
آقای بختیاری عزیز سلام
اتفاقا من هم تعجب کردم چون این پست ها را قبلا دیده بودم. و با توضیح پایانی شما شکم برطرف شد. به هر حال اتفاق خوبی افتاده است. بد نیست آدم بعضی وقت ها چیزهای قدیمی رو مرور و تازه کنه. من پیشنهاد می دم مطالبی که چند سال قبل در مورد الگوهای طراحی نوشتید رو به صورت مدون در قالب یک پی دی اف قابل دانلود منتشر کنید.
راستی من نمی دونستیم وبلاگ رو منتقل کردید. لطفا در وبلاگ قبلی یک توضیحی بگذارید. آدرستون رو در وبلاگم اصلاح می کنم و به این وبلاگ لینک می دم. موفق باشید
سلام آقای نوذری
خوشحالم که باز پیام شما را اینجا می بینم. ولی وبلاگ قبلی به صورت کلی حذف نشده است و همزمان هم هر دو وبلاگ بروز می شوند.
من خیلی دوست داشتم حداقل 23 الگوی کلاسیک را کامل کنم و در وبلاگ قرار دهم. ولی متاسفانه فرصت اینکار پیش نیامد ولی حتما سعی می کنم الگوهای را که بررسی کرده بودیم در قالب یک فایل پی دی اف منتشر کنم. و امیدوارم شما و دوستان دیگر کمک کنید تا نواقص و عیب های آنرا برطرف کنیم.