شاید شما هم زمانیکه تلویزیون را باز می کنید، یا وارد اینترنت می شود، یکراست به سراغ شبکه ها یا سایت های خبری می رود، تا از اتفاقات و رویدادهای مورد علاقه خود آگاه شود. حتی بعضی وقت ها این خبرها و رویدادها باعث می شوند شما روند کاری خود را تغییر دهید. حتی بعضی از خبرها در موضوعات خاص برای شما آنقدر اهمیت دارد که، عضو یک سایت خبری می شود تا هر زمانیکه خبر جدیدی وجود داشته باشد، به ایمیل شما نیز ارسال شود. بنابراین هر زمانیکه یک خبر جدید به سایت اضافه می شود، آن خبر به ایمیل شما نیز ارسال می شود. تا زمانیکه شما از عضویت در آن سایت انصراف ندادید، همه خبرهای جدید به شما ارسال می شود، و زمانیکه شما از عضویت خود انصراف دادید، خبرهای جدید به شما ارسال نخواهد شد ولی برای اعضاء دیگر سایت ارسال خواهد شد. اگر شما مسئول طراحی این سیستم بودید، چگونه عمل می کردید؟
یک مرکز کاریابی را در نظر بگیرید، افراد مختلفی با تخصص های مختلف، به این مرکز مراجعه می کنند، و با توجه به تخصص هایشان برای درخواست کار ثبت نام می کنند. هر زمانیکه درخواست نیرو توسط یک شرکت در یک تخصص خاص از آن مرکز شد. آن مرکز افرادی را که در آن تخصص ثبت نام کرده اند، از آن موقعیت کاری مطلع می کنند. اگر قرار باشد شما یک سیستم نرم افزاری برای این کار طراحی کنید، طراحی شما به چه صورت خواهد بود؟
هر کدام از ما می توانیم نسبت به درک خود از مسئله و سلیقه کاری، طراح های مختلفی برای این مسئله ارائه دهیم. اما یک طراحی که می تواند یک جواب خوب و عالی باشد، الگوی Observer است که توانسته است بارها و بارها به این مسئله پاسخ بدهد.
در هر دو مسئله بالا، ما یک شی داریم که مجموعه ای از اشیاء به آن وابسته هستند. هر زمانی که وضعیت شی مورد نظر تغییر می کند، اشیاء دیگر از آن تغییر آگاه می شوند. در این الگو، مجموعه اشیاء وابسته را Observer های می نامیم و شی را که دیگر اشیاء به آن وابسته هستند را Subject می نامیم. برای نمونه در مثال اول، افرادی که در سایت عضو می شوند یک شی Observer هستند. و شی خبر، همان Subject هست.
الگوی Observer یک وابستگی، یک به چند بین اشیاء هست، هنگامیکه شی طرف یک، وضعیتش تغییر کند، اشیاء وابسته مطلع می شوند و وضعیت خودشان را با توجه به آن وضعیت بروز رسانی می کنند.
مکانیزم عملکرد این الگو بصورت زیر است:
1- Subject باید یک اینترفیس برای ثبت (registering) و انصراف از عضویت (unregistering) و اطلاع از تغییرات را آماده کند.
2- Subject باید اطلاعات حالتی را که، observer ها برای آن ریجستر شده اند را به observer ها ارسال کند.
3- Observer باید یک اینترفیس برای دریافت پیام از Subject آماده کند.
نمودار کلاس این الگو بصورت زیر است:
با یک مثال دیگر کار را ادامه می دهیم. فرض کنید که در اداره شما ، در داده های پایگاه داده مرکزی تغییرات غیر مجازی، داده شده است. برای حل این مشکل مدیران پیشنهاد کرده اند که هر تغییری که در پایگاه داده می شود، باید توسط یک پیام، به افراد مشخص شده ای اعلام شود. شما برای حل این مشکل، الگوی Observer را در نظر می گیرید. دقیقا بر طبق نمودار عمل می کنیم و با یک حالت فرض این مثال را پیاده سازی می کنیم.
اینترفیس مربوط به subject |
Public Interface subject Sub Attach(ByVal Ins As Observer) Sub Detach(ByVal Ins As Observer) Sub Notify() End Interface |
اینترفیس مربوط به Observer |
Public Interface Observer Sub Update(ByVal operation As String, ByVal record As String) End Interface |
کلاس database که اینترفیس مربوط به subject را پیاده سازی می کند. |
Public Class dataBase Implements subject Private observers As ArrayList Private operation As String Private record As String
Public Sub New() observers = New ArrayList End Sub
Public Sub Attach(ByVal Ins As Observer) Implements subject.Attach observers.Add(Ins) End Sub
Public Sub Detach(ByVal Ins As Observer) Implements subject.Detach observers.Remove(observers) End Sub
Private Sub Notify() Implements subject.Notify For I As Integer = 0 To observers.Count – 1 Dim Ins As Observer = observers(i) Ins.Update(operation, record) Next End Sub Public Sub editDatabase(ByVal ope As String, ByVal rec As String) Me.operation = ope Me.record = rec Notify() End Sub
End Class |
کلاس Archiver که اینترفیس Observer را پیاده سازی می کند. |
Public Class Archiver Implements Observer Public Sub Update(ByVal operation As String, ByVal record As String) Implements Observer.Update MessageBox.Show(“The archiver says a “ + operation + ” operation was performed on “ + record) End Sub End Class |
کلاس boss که اینترفیس Observer را پیاده سازی می کند. |
Public Class Boss Implements Observer Public Sub Update(ByVal operation As String, ByVal record As String) Implements Observer.Update MessageBox.Show(“The boss says a “ + operation + ” operation was performed on “ + record) End Sub End Class
|
کلاس client که اینترفیس Observer را پیاده سازی می کند. |
Public Class client Implements Observer Public Sub Update(ByVal operation As String, ByVal record As String) Implements Observer.Update MessageBox.Show(“The client says a “ + operation + ” operation was performed on “ + record) End Sub End Class
|
تست |
Dim DB As New dataBase Dim Ar As New Archiver Dim Bo As New Boss Dim Cl As New client DB.Attach(Ar) DB.Attach(Bo) DB.Attach(Cl) DB.editDatabase(“Delete”, “Record 1”) |
در مثال بالا، ما سه نوع Observer داریم. که هر وقت تغییری در پایگاه داده اعمال می شود، با یک پیام به آنها اعلام می شود.
سلام.مطالبت خیلی آموزنده بود.بسیار از زحماتت تشکر میکنم.امیدوارم موفق باشی.
سلام آقای مهندس بختیاری من تمام مطلب وبلاگ شما رو خوندم واقعا دستت دردنگه که یکراست رفتی سر اصل مطب مخصوصا در مورد الگوهای طراحی خیلی گویا و روشن مطالب رو ارائه کردین . در واقع خیلی از زوایای تاریک الگوها برای من با مثالهای شما روشن شد . نمیدونم میتونم ازتون خواهش کنم که بقیه مطالب الگوهای طراحی رو برای من ایمیل کنید یا نه ،برای انکه واقعا نمیتونم منتظر وبلاگ بمونم چون فاصله ارائه مطالب خیلی زیاده و امکانات ما محدود و مطالب در این زمینه خیلی کم . و آخرین سئوال اینکه آیا مرجعی سراغ دارید تا یک نمونه کامل از شروع تا پایان یک پروژه را با استفاده از الگوهای طراحی و به زبان#C بصورت واقعی و کاربردی ارائه کرده باشه . من مجددا از زحمات شما در این زمینه کمال تشکر را دارم
با سلام- لطفا با من تماس بگیرید – در مورد نرم افزار کاریابی 09131546147