Harun Özer


Proje veya dijital katalog yaptırmak için
iletişim formu doldurabilirsiniz..

<< Interpreter Tasarım Deseni - Interpreter Design Pattern | Mediator Tasarım Deseni - Mediator Design Pattern>>

Iterator Tasarım Deseni - Iterator Design Pattern

Yazar harunozer 23 November 2012

Iterator Tasarım Deseni - Iterator Design Pattern Iterator (tekrarlayıcı) tasarım deseni, behavior grubununa ait, nesne koleksyonlarının (list,array,queue) elemanlarını belirlenen kurallara göre elde edilmesini düzenleyen tasarım desenidir. dofactory.com a göre hemen hemen bütün uygulamalarda kullanılmaktadır.

Nesne tabanlı dillerde uygulama geliştirilirken en sık kullanılan yapılardan biri de koleksiyonlardır.  Iterator tasarım deseni ile koleksiyon yapısı bilinmesine ihtiyaç olmadan koleksiyon elemanları üzerinde işlem yapılabilmesini sağlar. Yani iterator tasarım deseni kullanılarak koleksiyonun array, queue, list olması önemli olmadan, aynı şekilde elemanlarının elde edilmesi sağlanır. Koleksiyon içindeki nesnelerin nasıl elde edileceği tercihe göre belirlenebilir. Yani sonraki, ilk, son, 3. Eleman gibi istenilen şekilde elemanlara ulaşılabilir. Iterator tasarım deseninde 5 temel yapı bulunur.

  • Iterator: Koleksiyon elemanları elde edilebilmesi için gerekli işlemleri tanımlar.
  • Aggregate: Koleksiyon barındıran nesnelerin Iterator tipinden nesne oluşturacağını belirten arayüzdür.
  • Concrete Aggregate: Koleksiyon barındıran nesnedir. Aggregate arayüzünü uygular ve ilgili ConcreteIterator nesnesini oluşturur.
  • ConcreteIterator:  Aggregate yapısında ki koleksiyon elemanlarının elde edilmesini sağlayan metotları barındıran yani Iterator arayüzünü uygulayan gerçek iterator nesnesidir.
  • Client: Bu yapıyı kullanarak koleksiyon içindeki elemanlara erişen yapıdır.
  • Iterator tasarım deseni için uml diyagramı aşağıdadır.
     

Uml diyagramından da anlaşılacağı üzere Iterator arayüzü ile koleksiyon elemanları içinde dolaşılmasını sağlayan metotlar tanımlıdır. Bu metotları ihtiyaca göre de düzenlenebilir.  Aggregate nesnesi ise Iterator tipinden nesne verecek olan metodu tanımlıyor ve ConcreteAggregate nesneleri bu arayüzü uygulayarak ilgili koleksiyon elemanlarında dolaşılmasını sağlayan ConcreteIterator nesnesinin oluşturulmasından sorumlu oluyor. ConcreteIterator nesnesi ise Iterator arayüzünü uygulayarak içinde barındırdığı koleksiyon elemanlarında dolaşılmasını sağlıyor.

Sanırım artık basit bir uygulama geliştirebiliriz. Örneğin “Takim” nesnemiz olsun ve içinde “TakimAdi” ve “Puan” özelliklerini barındırsın ve bu nesnenin koleksiyonunu oluşturup nesneleri sırayla elde edelim.

Örnek uygulamamızın class diyagramı aşağıdadır.

Örnek uygulamamızın kodları şu şekilde olacaktır.
class Takim
{
    public string TakimAdi { get; set; }
    public int Puan { get; set; }
}

//Iterator arayüzü
interface ITakimIterator
{
    Takim Next();
    bool IsDone();
    Takim CurrentItem();
}
//Aggregate arayüzü
interface ITakimAggregate
{
    ITakimIterator GetIterator();
}
//ConcreteAggregate
class TakimConcreteAggregate : ITakimAggregate
{
    private List<Takim> _TakimList = new List<Takim>();
    public int TakimCount { get { return _TakimList.Count; } }
    public void Add(Takim t)
    {
        _TakimList.Add(t);
    }
    public Takim GetItem(int index)
    {
        return _TakimList[index];
    }
    public ITakimIterator GetIterator()
    {
        return new TakimConcreteIterator(this);
    }
}
//ConcreteIterator
class TakimConcreteIterator : ITakimIterator
{
    private TakimConcreteAggregate CollectionTakim;
    private int _index = 0;
    public TakimConcreteIterator(TakimConcreteAggregate ColTakim)
    {
        CollectionTakim = ColTakim;
    }
    public Takim Next()
    {
        _index++;
        if (IsDone())
            return CollectionTakim.GetItem(_index);
        else
            return null;
    }
    public bool IsDone()
    {
        return _index < CollectionTakim.TakimCount;
    }
    public Takim CurrentItem()
    {
        return CollectionTakim.GetItem(_index);
    }
}
//Client
class Program
{
    static void Main(string[] args)
    {
        TakimConcreteAggregate TakimCollection = new TakimConcreteAggregate();
        TakimCollection.Add(new Takim { TakimAdi = "Şalvar Spor", Puan = 59 });
        TakimCollection.Add(new Takim { TakimAdi = "Real Madrid", Puan = 9 });
        TakimCollection.Add(new Takim { TakimAdi = "Barcelona", Puan = 10 });
        ITakimIterator itr = TakimCollection.GetIterator();
        while (itr.IsDone())
        {
            Console.WriteLine("{0}:{1}", itr.CurrentItem().TakimAdi, itr.CurrentItem().Puan);
            itr.Next();
        }
        Console.ReadKey();
    }
}
 

Örneğimizdeki Takim nesnesi kolleksiyonu tutulacak nesnedir. ITakimIterator arayüzü ile Takim nesnesi koleksiyonunda ki elemanları elde etmek için kullanılacak metotları tanımlamış olduk. ITakimAggregate arayüzünde ise koleksiyon sınıfının hangi metot ile Iterator nesnesini üreteceğini belirtmiş olduk. TakimConcreteAggregate sınıfı ise içinde Takim nesnesi koleksiyonu barındıran sınıfımızdır ve ITakimAggregate arayüzünü uygulayarak içinde barındırdığı koleksiyonda dolaşılmasını sağlayacak olan ITakimIterator tipinde nesne örneğini sağlayacağını belirtmiştir. TakimConcreteIterator nesnesi ise kendisine verilen TakimConcreteAggregate içindeki koleksiyonda ki nesnelere erişimi sağlamıştır. Main metodunda ise TakimConcreteAggregate nesnesi oluşturulmuş , içinde barındırdığı Takim listesine elemanlar eklenmiş ve bu elemanlara erişmiştir yani iterator tasarım deseninin “Client” yapısıdır.

Diyelim ki bu uygulama gerçek bir uygulama ve bundan birkaç yıl sonra performans açısından çok daha iyi bir koleksiyon nesnesi  .net kütüphanesine dahil oldu. Tabi hal böyle olunca uygulamamızdaki mevcut List nesnelerini bu yeni koleksiyon nesnelerine çevirmek istiyoruz. Eğer Iterator desenini kullanmazsak bu listelere erişim olan bütün kodları da değiştirmemiz gerekecektir. Fakat Iterator tasarım deseni kullanıldığında Liste nin tipi önemli olmadığı için sadece ConcreteIterator ve ConcreteAggregate nesneleri oluşturularak veya mevcut yapıdaki List nesneleri yeni koleksiyon nesnesi ile değiştirilerek kolay bir şekilde güncelleme yapılabilir.

Örnek uygulama aşağıdadır.

IteratorSample.rar

Tam Sayfa
Tags tasarım desenleri,
Kategoriler c#.net, Tasarım Desenleri
İşlemler
Bu Makale 2  Kez Beğenildi.
İsim :    
e-Mail :    
Web Site :  
İmage :  
Güvenlik Kodu :  

Güvenlik Resmi
Resmi Yenile
    
Yorum :  
Tasarım Desenleri ve Mimarileri