C#'ta Iterator Design Pattern

C#'ta Iterator Design Pattern kullanımı

Iterator Design Pattern Behavioral Patterns gurubunda yer alır. Bir nesne kümesi içindeki elemanlara erişim ve elemanlar arasında dolaşma ihtiyaçları için kullanılır. Iterator Design Patterni .Net içerisinde bilinçli olarak kullanmasak da arkaplanda çalışan yapılar aracılığı ile (örneğin IEnumerable arayüzü) kodlarımız içinde sıkça kullanırız.

Aggregate: Kolleksiyonun dolaşım işlemleri için Concrete Iterator tipli metodun uygulanması için sunduğu Interface yada Abstract Class. Kolleksiyon olarak tanımlanacak sınıflar bu yapıyı uygulamalıdır.

ConcreteAggreagate: Kolleksiyonların tutulduğu sınıf.

Iterator: Kolleksiyon içindeki elemanlara erişim için gerekli yapının şablonu Interface yada Abstract Class.

ConcreteIterator: Kolleksiyon içindeki elemanlara erişim için gerekli asıl iterator yapısı.

Örneğimizde oluşturulan bir kolleksiyon içerisinde iterator pattern uygulanacak ve kolleksiyon elemanları arasında dolaşım sağlanacaktır.

DoFactory üzerindeki hazır örnek alınmıştır.

namespace ConsoleApplication1

{

class MainApp

{

static void Main()

{

Collection collection = new Collection(); collection[0] = new Item("Item 0"); collection[1] = new Item("Item 1"); collection[2] = new Item("Item 2"); collection[3] = new Item("Item 3"); collection[4] = new Item("Item 4"); collection[5] = new Item("Item 5"); collection[6] = new Item("Item 6"); collection[7] = new Item("Item 7"); collection[8] = new Item("Item 8");


Iterator iterator = new Iterator(collection);


iterator.Step = 2;


Console.WriteLine("Iterating over collection:");


for (Item item = iterator.First();

!iterator.IsDone; item = iterator.Next())

{

Console.WriteLine(item.Name);

}


Console.ReadKey();

}

}


//Item class Item

{

private string _name;


public Item(string name)

{

this._name = name;

}


public string Name

{

get { return _name; }

}

}


//Aggregate

interface IAbstractCollection

{

Iterator CreateIterator();

}


//ConcreteAggregate

class Collection : IAbstractCollection

{

private ArrayList _items = new ArrayList();


public Iterator CreateIterator()

{

return new Iterator(this);

}


public int Count

{

get { return _items.Count; }

}


public object this[int index]

{

get { return _items[index]; } set { _items.Add(value); }

}

}



//Iterator

interface IAbstractIterator

{

Item First(); Item Next();

bool IsDone { get; }

Item CurrentItem { get; }

}



//ConcreteIterator

class Iterator : IAbstractIterator

{

private Collection _collection; private int _current = 0; private int _step = 1;


public Iterator(Collection collection)

{

this._collection = collection;

}


public Item First()

{

_current = 0;

return _collection[_current] as Item;

}


public Item Next()

{

_current += _step; if (!IsDone)

return _collection[_current] as Item;


else


}


return null;

public int Step

{

get { return _step; } set { _step = value; }

}


public Item CurrentItem

{

get { return _collection[_current] as Item; }

}


public bool IsDone

{

get { return _current >= _collection.Count; }

}

}

}

 

Ekran Çıktısı

  • Iterating over collection: Item 0
  • Item 2
  • Item 4
  • Item 6
  • Item 8

iterator.Step = 2; kodu ile koleksiyon üzerinde 2'şer adımla dolaşılmış ve kolleksiyon içindeki elemanlar alınmıştır. Ayrıca .net framework içindeki hazır yapıları IEnumerable, IEnumerator gibi kavramları inceleyebilirsiniz.

Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git