Harun Özer


Proje veya dijital katalog yaptırmak için
iletişim formu doldurabilirsiniz..

<< Memento Tasarım Deseni - Memento Design Pattern | State Tasarım Deseni - State Design Pattern>>

Observer Tasarım Deseni - Observer Design Pattern

Yazar harunozer 26 November 2012

Observer Tasarım Deseni - Observer Design Pattern Observer tasarım deseni behavior grubununa ait, bir nesnede meydana gelen değişikliklerde içinde bulundurduğu listede bulunan nesnelere haber gönderen tasarım desenidir. Observer tasarım deseninin dofactory.com a göre en sık kullanılan tasarım desenlerindendir.

Uygulanması gayet basit bir tasarım deseni ile daha karşı karşıyayız. Observer tasarım deseni; birbirleri ile bire çok (yani bir nesnenin içinde başka bir nesnenin listesinin bulunması olarak düşünebiliriz) ilişki olan nesneler arasında olay bazlı bir etkileşim olduğu durumları düzenler. Örnek senaryo olarak

  • Bir e-ticaret sitesinde bir üründeki stok değişiminde o ürünü takip eden üyelere haber verilmesi.
  • Ham madde – ürün ilişkisi olan bir durumda, ham maddenin fiyatı değişince ürünün fiyatının da değişmesi.
  • Facebook da ki bir iletiye yorum yapılması durumunda o iletiye yorum yapan ve beğenen üyelere bildirim gitmesi

Ve bunun gibi birçok senaryo da düşünüle bilinir. Özetle çalışma mantığı; bir nesnede bir liste vardır ve o nesnede bir durum oluştuğunda listedeki bütün nesnelerde bir metot çalıştırılır. Observer tasarım deseninin uml şeması aşağıdaki gibidir.

Observer tasarım deseni ile ilgili basit bir uygulama yapalım. Uygulamamızda ürünler ve üyeler olsun. Ürünün fiyatı değiştiğinde o ürünü takip listesine ekleyen üyelere haber versin. Uygulamamızın class diyagramı aşağıdaki gibidir.

Örnek uygulamamızın kodları ve açıklaması aşağıdadır.

//Subject
abstract class absUrun
{
    public string UrunAdi { get; set; }
    private decimal _Fiyat;

    /*Direkt erişim yerine private tanımlanıp, tanımlanacak metotlar ile yapılabilir.*/
    //Observer nesne listesi
    public List<IUye> TakipList = new List<IUye>();
    public absUrun(string UrunAd, decimal UrunFiyat)
    {
        this.UrunAdi = UrunAd;
        this._Fiyat = UrunFiyat;
    }
    public decimal Fiyat
    {
        get { return _Fiyat; }
        set
        {
            //fiaytı düşmüş ise üyelere haber ver
            if (_Fiyat > value)
                NotifyUrun();
            _Fiyat = value;
        }
    }
    public void NotifyUrun()
    {
        foreach (IUye item in TakipList)
        {
            item.Update(this);
        }
    }
}
//ConcreteSubject
class Urun : absUrun
{
    public Urun(string UrunAd, decimal Fiyat)
        : base(UrunAd, Fiyat)
    {
    }
}
//Observer
interface IUye
{
    void Update(absUrun urun);
}
//ConcreteObserver
class Uye : IUye
{
    public string E_Mail { get; set; }
    public void Update(absUrun u)
    {
        Console.WriteLine("{0} ın fiyatı {1} oldu {2} adresine gönderildi.", u.UrunAdi, u.Fiyat.ToString("C2"), E_Mail);
    }
}
class Program
{
    static void Main(string[] args)
    {
        //İlk olarak Subject nesnemizi oluşturuyoruz.
        absUrun Kitap = new Urun("Kitap", 10.25M);
        //Subject nesnemiz ile ilgili olan Uye (observer) listesine nesne ekliyoruz.
        Kitap.TakipList.Add(new Uye { E_Mail = "a@a.com" });
        Kitap.TakipList.Add(new Uye { E_Mail = "b@b.com" });
        //Subject yani ürün fiyatını değiştirdiğimizde listedeki
        //observer nesnelerinin ilgili metodu çalıştırılacak
        Kitap.Fiyat = 8.99M;
        Console.ReadKey();
    }
}
 

Uygulamamızda ki “AbsUrun” nesnesi; içinde barındırdığı “Fiyat” özelliği değiştirildiğinde, içinde barındırdığı liste de ki nesnelerde bir metodu çalıştıracak olan “Subject” yapısına karşılık gelen soyut sınıftır. “Urun” sınıfı ise gerçek subject sınıfımızdır ve “AbsSubject” abstract sınıfından türediği için “AbsSubject” de ki özelliklere sahiptir. Bu uygulama için soyut subject sınıfa ihtiyaç olmasa da bu kullanımı da göstermek adına yapıyı bu şekilde oluşturdum. “IUye” ise “Urun” nesnesinin içinde listesi bulunacak olan “Observer” yapısına karşılık gelmektedir. “ConcreteObserver” yapısına karşılık gelen “Uye” sınıfı bu “IUye” ara yüzünden türeyerek “Subject” yapısında ki listede tutula bilinecek bir yapıya bürünmüş oldu. “AbsUrun” abstract sınıfında ki “Fiyat” özelliği değiştiğinde çalışan Notify() metodu içinde “IUye” ara yüzünden implemente ettiği “Update” metotu çalıştırılır ve ilişkili olduğu “Subject” deki değişiklikten haberdar olabilir bir yapıda olmuş oldu.

Uygulamamızın kodlarını aşağıdaki linkten indirebilirsiniz.

ObserverSample.rar

Tam Sayfa
Tags tasarım desenleri,
Kategoriler c#.net, Tasarım Desenleri
İşlemler
Bu Makale 3  Kez Beğenildi.
İsim :    
e-Mail :    
Web Site :  
İmage :  
Güvenlik Kodu :  

Güvenlik Resmi
Resmi Yenile
    
Yorum :  
Tasarım Desenleri ve Mimarileri