Bir nesnenin durumu değiştiğinde ve bu değişikliği diğer nesnelere bildirmesi gerektiğinde kullanılan patterndir. Birçok nesne arasındaki bağımlılıkları azaltmak için kullanılır ve bu nesneler arasındaki iletişimi kolaylaştırır.
Bu pattern ile ilgili kavramlardan bahsedecek olursak:
Subject
Takip edilecek nesneyi ifade etmektedir.
Observer
Subject ‘i takip edecek olan nesneler farklı tiplerden oluşabileceği için bir abstract veya interface ‘e ihtiyacımız var, burada observer dediğimiz arayüz ile bunu sağlayacağız.
Concrete
Subject’i takip eden nesnelerdir.
Örnek olarak sistem kullanıcılarını ve müşterileri bilgilendiren sistemde bu patterni nasıl uygulayabiliriz ona bakalım.
Öncelikle INotificationSubject ve IObserver interface lerimizi oluşturalım.
interface INotificationSubject
{
void SendNotification(string message);
void Attach(IObserver observer);
void Detach(IObserver observer);
}
interface IObserver
{
void Update(string message);
}
NotificationSubject class ‘ımızı INotificationSubject ‘ten inherit edip, metotlarımızı yazalım.
class NotificationSubject : INotificationSubject
{
List<IObserver> observers = new List<IObserver>();
public void SendNotification(string message)
{
Notify(message);
}
public void Attach(IObserver observer)
{
observers.Add(observer);
}
public void Detach(IObserver observer)
{
observers.Remove(observer);
}
private void Notify(string message)
{
foreach (var observer in observers)
{
observer.Update(message);
}
}
}
Sıra geldi observer ‘larımızı oluşturmaya.
class UserObserver : IObserver
{
private string email;
public UserObserver(string email)
{
this.email = email;
}
public void Update(string message)
{
Console.WriteLine($"User [Email: {email}] notification received: {message}");
}
}
class CustomerObserver : IObserver
{
private string email;
public CustomerObserver(string email)
{
this.email = email;
}
public void Update(string message)
{
Console.WriteLine($"Customer [Email: {email}] notification received: {message}");
}
}
Şimdi nasıl kullanacağımıza bakalım.
internal class Program
{
static void Main(string[] args)
{
NotificationSubject notificationSubject = new NotificationSubject();
notificationSubject.Attach(new UserObserver("user1@gmail.com"));
notificationSubject.Attach(new CustomerObserver("customer1@gmail.com"));
notificationSubject.SendNotification("Hi guys! New feature published!");
Console.ReadLine();
}
}
Özetle ne yaptığımızdan bahsedecek olursak; tanımladığımız 2 observer nesnesini NotificationSubject ‘e subscribe ettik ve NotificationSubject.SendNotification çalıştırıldığında bütün subscribe olan observer ‘lara bildirimin ulaşmasını sağladık.
Eğer daha önce SignalR ile uğraştıysanız bu patterni ona benzetebilirsiniz, zira SignalR ‘ın temeli de bu patterne dayanmaktadır 🙂
Bir başka yazıda görüşmek üzere !