Welcome to My Blog 👋

Java, Spring Framework, Microservices, Docker, Kubernetes, AWS and Others 🚀
Follow Me

Design Pattern - Observer Pattern



  April 24, 2019    Labels:,,,,,,,, 

Bu pattern türkçe olarak gözlemci anlamına gelmektedir. İsminden de anlaşılacağı gibi temelde yaptığı için bir başka nesneyi gözlemektir. Daha detaylı anlatacak olursak bir nesnenin verileri bir başka nesneye bağlı olabilir. Bağlı olduğu nesnedeki verilerin değişiminden etkilenebilir. Bu durumda bağlı olduğu nesneyi gözlemlemesi gerekir ve o nesnede değişiklik olduğunda kendini güncellemesi gerekir. Örnek verecek olursak MVC pattern'ında ekranda bulunan view nesneleri model nesnelerine bağlıdırlar. Model nesnelerinde yapılacak bir değişiklikte view nesneleri otomatik olarak güncellenir ve ekrana yansır. 
Bu pattern ile aradaki bağımlılık gevşek bağlıdır. Bağımlılığı sıkı bağlı şekilde yapmak yazılımsal anlamda çok büyük problemlere yol açabilir. Bu yüzden bu pattern'ı kullanarak birbirlerine bağımlı olan nesneleri gevşek bağlı şekilde sekronize edebiliriz.
Java'nın içerisinde bu pattern'a ait hazır bir yapı bulunmaktadır. java.util paketinde bulunan Observer adındaki interface ve Observable adındaki sınıf ile bu pattern kullanılabilir.

Uygulama
  • ConcreteSubject bizim model nesnemizdir. Yani bağımlı olduğumuz nesnedir. Bu nesne üzerinde yapılan bir değişiklikten haberimiz olsun istiyoruz.
  • ConcreteSubject nesnemize implement ettiğimiz Subject interface'i bu nesneyi izlememiz için gerekli metotları bize sağlar. Bu metotlar nesneyi izlemek isteyen nesnelerin kayıt olabilecekleri attach metodu, kayıtlarını kaldırabilecekleri detach metodu ve değişiklik durumunda kayıtlı bulunan nesnelere gönderilecek mesaj için notify metodudur.
  • ConcreteSubject yani izlediğimiz nesne Observer interface'ini kullanarak bir değişikliklik olduğunda bu interface'in update metodunu çağırır. Bu interface update edeceğimiz nesneyi içerisinde barındıran bir arayüz olur dolayısıyla güncellemek istediğimiz nesnede bir update işlemi yapmış oluruz.
  • Eğer izleme olayı çift yönlü olsun istersek yani gözlemci nesnede bir değişiklik olduğunda model nesnesi de güncellensin istersek çift yönlü bağlama yapmamız gerekir.




public class ConcreteSubject implements Subject{
    private ArrayList<Observer> observers;

     public void attach (Observer observer) {
         observer.add(observer);
     }
     
     public void detach (Observer observer) {
         observer.remove(observer);
     }
     
     public void notify () {
         for (Observer observer : observers) {
             observer.update();
         }
     }
}

public interface Subject {
    public void attach ();
    public void detach ();
    public void notify ();
}

public class ConcreteObserver implements Observer () {
    ConcreteSubject concreteSubject;
    
    public void update () {
        //örneğin ekrandaki veriyi güncelleri
    }
}

public interface Observer {
    public void update ();
}

No comments:

Post a Comment