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 Authenticator Pattern » Prototype Pattern » Iterator pattern » Command pattern » Common Attribute Registry Pattern » Adapter Pattern » Read-Write Lock Pattern » Façade Pattern » Singleton Pattern » Aggregate Enforcer Pattern » Interpreter pattern » Memento pattern » Strategy pattern » Object Cache Pattern » pattern » Critical Section Pattern » Visitor pattern » Abstract Factory Pattern » Mediator pattern » Builder Pattern » Composite Pattern » Factory Method Pattern » Chain of responsibility pattern » Flyweight Pattern » Explicit Object Release Pattern » Guarded Suspension Pattern » Virtual Proxy Pattern » Decorator Pattern » Consistent Lock Order Pattern » State pattern » Proxy Pattern » Template Method pattern » Counting Proxy Pattern » Null Object Pattern » Bridge Pattern

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