Yazarlar Sözlük Makaleler Yardım Masası Gözlük Forum İstatistik

Tüm Başlıklar XML

1.  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
fizikci
01 Kasım 2005 21:33
2.  Publish Subscribe olarak da bilinir. ***
sertw
22 Ocak 2006 14:45
Bu konuda bildiklerinizi bizlerle paylaşabilirsiniz
Tabi bunun için yazarsanız giriş yapmalı, yazar değilseniz yazar olmalısınız.


Bu başlığa bkz veren girişlerin başlıkları nedir?

Bu başlığa bkz veren girişler başka hangi başlıklara bkz verdiler?
» Object Cache Pattern » Aggregate Enforcer Pattern » Adapter Pattern » State pattern » Factory Method Pattern » Flyweight Pattern » Object Authenticator Pattern » Command pattern » Null Object Pattern » Chain of responsibility pattern » Virtual Proxy Pattern » Composite Pattern » Template Method pattern » Proxy Pattern » Counting Proxy Pattern » pattern » Interpreter pattern » Bridge Pattern » Decorator Pattern » Strategy pattern » Explicit Object Release Pattern » Visitor pattern » Memento pattern » Iterator pattern » Consistent Lock Order Pattern » Façade Pattern » Mediator pattern » Guarded Suspension Pattern » Read-Write Lock Pattern » Builder Pattern » Prototype Pattern » Critical Section Pattern » Abstract Factory Pattern » Common Attribute Registry Pattern » Singleton Pattern

© 2005, Bilişim Kulübü. (1109 ms)
Ne yapabilirsin: SubtitleClick ile İngilizceni Geliştir, Çınar Framework ile kod yaz, Eglencelik.org'ta biraz eğlen