Observer tasarım deseni, bir nesnede meydana gelen değişikliği içinde bulunduğu listedeki tüm elemanlara bildiren tasarım desenidir.
Aşağıda bu tasarım desenine ait UML diyagramı bulunmaktadır.
Observer: Değişimden etkilenecek, izleyecek olan sınıfların uyguladığı arayüzdür. Duruma göre soyut sınıf (abstract class) da olabilir.
ConcreteObserver: Observer arayüzünü uygulayan, değişimi takip eden sınıflardır. Değişim update metotu ile bildirilir.
Observable: Takip edilecek olan yapımızdır. İçerisinde Observer (değişimden etkilenecek) nesneleri tutar.
ConcreteObservable:Observer sınıfından türerler.
Senaryo olarak kullanıcılarımızın olduğunu ve bu kullanıcıların fiyatını takip ettiği bir ürün olduğunu farz edelim. Ürün fiyatı değiştikten sonra takip eden kullanıcılara bir mesaj gittiğini düşünelim.
C# Kod Örneği:
// Değişimden etkilenecek, izleyecek olan sınıfların uyguladığı arayüzdür.// UML diyagramındaki Observer yapısına denk gelmektedir.interfaceIObserverUser{voidSendNotification(ProductUpdateMessage message);}
// Observer arayüzünü uygulayan, değişimi takip eden sınıflardır.// Değişim update metotu ile bildirilir.// UML diyagramındaki ConcreteObserver yapısına denk gelmektedir.classObserverUser:IObserverUser{publicvoidSendNotification(ProductUpdateMessage message) {Console.WriteLine(message.ToString()); }}
// Bildirilecek olan nesnelere paremetre olarak giden mesaj.// UML diyagramı ile ilgisi yoktur.classProductUpdateMessage{publicstring productName;publicstring message;publicoverridestringToString() {return$"{productName} updated. Message: {message}"; }}
// Takip edilecek olan yapımızdır.// İçerisinde Observer (değişimden etkilenecek) nesneleri tutar.// UML diyagramındaki Observable yapısına denk gelmektedir.abstractclassObservableProduct{privateList<IObserverUser> _users;protectedProductUpdateMessage message;publicObservableProduct() { _users =newList<IObserverUser>(); message =newProductUpdateMessage(); }publicvoidAddObserver(IObserverUser observerUser) {_users.Add(observerUser); }publicvoidRemoveObserver(IObserverUser observerUser) {_users.Remove(observerUser); }publicvoidNotifyObserver() {foreach (IObserverUser user in _users) {user.SendNotification(message); } }}
// Observer sınıfından türer.// UML diyagramındaki ConcreteObservable yapısına denk gelmektedir.classSamsung:ObservableProduct{ // Ürün fiyatı değiştikten sonra Observer örneklerine bildirim gönderilir.publicvoidChangePrice() { // Ürün fiyatlarının güncellenmesi vs.this.message.productName="Samsung";this.message.message="Samsung's price updated.";this.NotifyObserver(); }}
// Güncellemeden etkilenecek olan sınıf örnekleri.IObserverUser mehmet =newObserverUser();IObserverUser derya =newObserverUser();IObserverUser sema =newObserverUser();IObserverUser aleyna =newObserverUser();// İzlenecek olan sınıf örneği.Samsung samsung =newSamsung();// İzlenecek olan sınıfa etkilenecek olan nesnelerin atanması.samsung.AddObserver(mehmet);samsung.AddObserver(derya);samsung.AddObserver(sema);samsung.AddObserver(aleyna);samsung.ChangePrice();// output:// Samsung updated. Message: Samsung's price updated.// Samsung updated. Message: Samsung's price updated.// Samsung updated. Message: Samsung's price updated.// Samsung updated. Message: Samsung's price updated.