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