Bir nesnedeki değişikliği ilgilenen nesnelere haber vermekle ilgili tasarım şablonu.
Bunun için değişiklikleri takip etmek isteyen nesneler bir şekilde değişikliğe uğrayan nesneye kendilerini register ettirirler veya o nesne hakkında son dakika haberleri veren gazeteye abone olurlar.
Bir C# örneğini Microsoft'un sitesinde olduğu gibi yazalım. Dinleyen nesne IObserver interface'ini implement etsin, dinlenen nesne de IObservable. Bu durumda IObserver ve IObservable arabirimlerini şu şekilde tasarlayabiliriz:
// Dinleyici nesnelerin implement etmesi gereken interface
public interface IObserver {
void Notify(object anObject);
}
// Dinlenebilen nesnelerin implement etmesi gereken interface
public interface IObservable {
void Register(IObserver anObserver);
void UnRegister(IObserver anObserver);
}
Devam etmeden şu UML diagramını incelemek faydalı olabilir:
http://upload.wikimedia.org/wikipedia/en/d/dc/Observer-pattern-uml.jpg
IObservable'ı implement eden nesnelerin ortaklaşa sahip olduğu iki method var. Register ve unregister. Abonelikle ilgili bu iki metodu implement eden bir sınıf yazıp tüm IObservable'ları bu sınıftan türetebiliriz.
public class ObservableImpl : IObservable
{
protected Hashtable _observerContainer = new Hashtable();
public void Register(IObserver anObserver)
{
_observerContainer.Add(anObserver,anObserver);
}
public void UnRegister(IObserver anObserver)
{
_observerContainer.Remove(anObserver);
}
public void NotifyObservers(object anObject)
{
foreach(IObserver anObserver in _observerContainer.Keys)
anObserver.Notify(anObject);
}
}
Son olarak bir tane örnek IObserver, bir tane de IObservable oluşturup, IObserver'ın IObservable'ı dinleyişini görelim:
public class DinlenenSinif : ObservableImpl
{
object _birNesne;
public object BirNesne
{
set{
_birNesne = value;
base.NotifyObservers(_birNesne);
}
}
}
public class Dinleyici : IObserver
{
public void Notify(object anObject)
{
Console.WriteLine("o nesne : " + anObject);
}
}
public class Deneyelim
{
public static void Main()
{
Dinleyici dinleyici = new Dinleyici();
DinlenenSinif dinlenen = new DinlenenSinif();
dinlenen.Register(dinleyici);
for(int looper=0;looper < 100;looper++)
dinlenen.BirNesne = looper;
dinlenen.UnRegister(dinleyici);
}
}
Bu kodu çalıştırdığımızda dinlenen nesnede oluşan değişikliklerden dinleyici (abone) nesnenin haberdar olduğunu göreceğiz.
Aslında bütün bu işleri bir event tanımlayarak da yapabilirdik.
Ayrıntılı bilgi için :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/observerpattern.asp
|