C# Observer Pattern Kullanımı - OOP Design Pattern



Değişimini izlemek istediğiniz bir değer düşünün mesela stok takip sisteminiz var ve bir ürünün miktarı değiştiğinde bayillere bunu otomatik bildirmek istiyorsunuz. Yada bankacılıktan bir örnek verelim bir hissenin fiyatı değiştiğinde o hisseyi satın alan kişileri bilgilendirmek istiyosunuz. Bu örneklerdeki gibi bir nesnenin (Subject, Concrete Subject) değişimini başka nesnelerle (Observer, ConcreteObserver) takip etmek istiyorsak bu pattern bizim işimize yarayacaktır.




Kodunu yazacağımız örneği farklı tasarladım. Örneğin Element bir entity var. Bu element entity’sini veritabanından çekip dolduruyoruz. Program içerisinde bir takım işlemler yapılıyor bu entity’e ve ardından veritabanını yormamak amacıyla sadece entity üzerinde bir değişiklik olduysa içeri atılıyor. Değişiklik yok ise güncellememize gerek yok ve bu sayede devamlı veritabanına değişmemiş bir entity için gidip gelmiyoruz.



    /// <summary>
    /// Abstract Subject
    /// </summary>
    abstract class ElementBase
    {
        public delegate void ElementChange(Element element);
        public event ElementChange OnElementChange = null;

        public void Attach(ElementChangeListener listener)
        {
            OnElementChange += new ElementChange(listener.Update);
        }

        public void Detach(ElementChangeListener listener)
        {
            OnElementChange -= new ElementChange(listener.Update);
        }

        public void Notify(Element element)
        {
            if (OnElementChange != null)
            {
                OnElementChange(element);
            }
        }

         /// <summary>
    /// Concrete Subject
    /// </summary>
    class Element: ElementBase
    {
        private int _elementId;
        private string _name;

        public int ElementId
        {
            get
            {
                return _elementId;
            }
            set
            {
                if (_elementId != value)
                {
                    _elementId = value;
                    Notify(this);
                }
            }
        }

        public string Name
        {
            get
            {
                return _name;
            }
            set
            {
                if (_name != value)
                {
                    _name = value;
                    Notify(this);
                }
            }
        }
    }
    /// <summary>
    /// Observer Interface
    /// </summary>
    interface IObserver
    {
        void Update(Element e);
    }
    /// <summary>
    /// Concrete Observer
    /// </summary>
    class ElementChangeListener: IObserver
    {
        public void Update(Element element)
        {
            Console.WriteLine(@"{0} Id'li element değişmiştir.", element.ElementId);
        }
    }


        static void Main(string[] args)
        {
            Element element1 = new Element { ElementId = 1, Name = "Element 1" };
            element1.Attach(new ElementChangeListener());

            element1.Name = "Element 2";

            Console.ReadLine();

        }


Çıktı:



Ekran görüntüsünden görüldüğü gibi elementimizin adı “Element 2” yapıldığında ElementChangeListener sınıfımız bilgilendirilmiş bu sınıfın Update metodu çalıştırılmıştır.


0 yorum :

Yorum Gönder