
الگوی طراحـــــــــی Observer
الگوی طراحی Observer یک الگوی رایج در برنامهنویسی است که برای ایجاد رابطهی یک به چند (One-to-Many) بین اجزاء به کار میرود. در این الگو، یک شیء اصلی به نام Subject (موضوع) و یک یا چند شیء تابعی به نام Observer (مشاهدهگر) وجود دارد. وقتی که Subject خود را تغییر دهد، تمامی Observerها به طور خودکار مطلع میشوند و تغییرات را دریافت میکنند. این الگو برای ایجاد ارتباطها و کنترل تغییرات در برنامهها مفید است.
مفهوم الگوی Observer به این صورت است که ما یک کلاس Subject داریم که Observerها را ثبت میکند و متدهای مربوط به اطلاعرسانی تغییرات به آنها را فراهم میکند. همچنین کلاس Observer نیز وجود دارد که مشاهدهگری را نمایش میدهد و از طریق رابط (Interface) خاصی، اطلاعرسانی تغییرات از Subject را دریافت میکند.
معمولاً اجزاء اصلی الگوی طراحی Observer شامل موارد زیر هستند:
1. Subject: کلاسی است که Observerها را ثبت میکند و متدهای مربوط به اطلاعرسانی تغییرات به آنها را پیادهسازی میکند.
2. ConcreteSubject: کلاسی است که از کلاس Subject ارثبری میکند و متدهای مربوط به اطلاعرسانی تغییرات به طور واقعی را پیادهسازی میکند.
2. ConcreteSubject: کلاسی است که از کلاس Subject ارثبری میکند و متدهای مربوط به اطلاعرسانی تغییرات به طور واقعی را پیادهسازی میکند.
3. Observer: رابط یا کلاسی است که مشاهدهگری را نمایش میدهد و از طریق رابط (Interface) خاصی، اطلاعرسانی تغییرات از Subject را دریافت میکند.
4. ConcreteObserver: کلاسی است که از کلاس Observer ارثبری میکند و روشهای مربوط به اطلاعرسانی تغییرات از Subject را پیادهسازی میکند.
حالا با یک مثال واقعی از الگوی Observer در زبان سی شارپ آشنا میشویم:
فرض کنید ما یک سامانه نوتیفیکیشن داریم که برای کاربران خود اطلاعرسانی میکند. در این سامانه، کاربران میتوانند خود را برای دریافت اطلاعیهها ثبت کنند و سامانه باید به صورت خودکار اطلاعیههای جدید را برای کاربران ارسال کند.
1. Subject:
1public interface INotificationSubject
2{
3 void RegisterObserver(INotificationObserver observer);
4 void RemoveObserver(INotificationObserver observer);
5 void NotifyObservers(string message);
6}
2. ConcreteSubject:
1public class NotificationService : INotificationSubject
2{
3 private List<INotificationObserver> _observers = new List<INotificationObserver>();
4
5 public void RegisterObserver(INotificationObserver observer)
6 {
7 _observers.Add(observer);
8 }
9
10 public void RemoveObserver(INotificationObserver observer)
11 {
12 _observers.Remove(observer);
13 }
14
15 public void NotifyObservers(string message)
16 {
17 foreach (var observer in _observers)
18 {
19 observer.OnNotificationReceived(message);
20 }
21 }
22}
3. Observer:
1public interface INotificationObserver
2{
3 void OnNotificationReceived(string message);
4}
4. ConcreteObserver:
1public class UserNotificationObserver : INotificationObserver
2{
3 private string _name;
4
5 public UserNotificationObserver(string name)
6 {
7 _name = name;
8 }
9
10 public void OnNotificationReceived(string message)
11 {
12 Console.WriteLine($"{_name} received notification: {message}");
13 }
14}
5. Client (کلاینت):
1public class Program
2{
3 public static void Main()
4 {
5 NotificationService notificationService = new NotificationService();
6
7 // کاربرانی که مایل به دریافت اطلاعیهها هستند
8 UserNotificationObserver user1 = new UserNotificationObserver("John");
9 UserNotificationObserver user2 = new UserNotificationObserver("Alice");
10 UserNotificationObserver user3 = new UserNotificationObserver("Bob");
11
12 // ثبت کاربران در سامانه
13 notificationService.RegisterObserver(user1);
14 notificationService.RegisterObserver(user2);
15 notificationService.RegisterObserver(user3);
16
17 // ارسال اطلاعیه به همهی کاربران
18 notificationService.NotifyObservers("New notification: System maintenance tonight");
19
20 // حذف کاربر از سامانه
21 notificationService.RemoveObserver(user2);
22
23 // ارسال اطلاعیه به کاربران باقیمانده
24 notificationService.NotifyObservers("New notification: Sale is now live");
25 }
26}
خروجی برنامه به صورت زیر خواهد بود:
John received notification: New notification: System maintenance tonight
Alice received notification: New notification: System maintenance tonight
Bob received notification: New notification: System maintenance tonight
John received notification: New notification: Sale is now live
Bob received notification: New notification: Sale is now live
در این مثال، با استفاده از الگوی Observer، ما یک سامانه نوتیفیکیشن ایجاد کردیم که به کاربران خود اطلاعرسانی میکند. کاربران که به عنوان Observer ثبت نام کردهاند، اطلاعیهها را از Subject (NotificationService) دریافت میکنند. هرگاه یک اطلاعیه جدید ارسال شود، تمام کاربران به طور خودکار مطلع میشوند.