Iterator tasarım deseni, koleksiyon üzerindeki elemanların üzerinde dolaşmak için kullanılan tasarım desenidir.
Uygulamalarımızı geliştirirken verilerimizi bir yerlerde tutma gereği duyarız. Burada birçok seçenek vardır. Ağaç, liste, kuyruk, yığın gibi. Liste gibi yapılarda dolaşmak, verileri elde etmek kolaydır fakat iş kompleks yapılara doğru gittiğinde veri üzerinde dolanmak biraz daha zorlaşabiliyor.
Örneğin; Ağaç yapısını kullandığınızı ve veri üzerinde dolanma işlemleri için inorder seçeneğini seçtiniz. Fakat başka bir zaman mecburi bir değişiklikten sonra arama yönteminizi postorder olarak değiştirdiniz. Burada sürekli bir değişim mevcuttur. Bunları soyutlamak, değişikliğe adapte olmak gibi bir çok işlemleri Iterator tasarım deseni ile gerçekleştirilebilmektedir.
Iterator tasarım deseninin en önemli özelliği gezdiği koleksiyonun ne olduğunu bilmemesidir yani iterasyon işlemlerini gerçekleştirmek üzere kurguludur. Böylece kullandığı veri yapısının ve çalışma tarzının uygulamanın diğer kısımları ile olan bağlantılarını en aza indirilir. Bu iterasyon işlemlerinin gerçekleştiği yapı; liste, ağaç, kuyruk vs. olabilir.
Bu tasarım desenine ait UML diyagramı aşağıdaki gibidir.
Iterator: Koleksiyon üzerinde dolaşmak, nesneleri elde edebilmek için gerekli operasyonların tanımlandığı arayüzdür. Bir sonraki elemana geçme, bir sonraki elemanın olup olmadığı gibi.
ConcreteIterator:Iterator arayüzünü ve koleksiyon üzerinde dolaşmak için gerekli metotları uygular. Veriler üzerinde dolanma işlemleri burada gerçekleştirilecektir.
Aggregate:Iterator arayüzünü uygulayan sınıf örneklerini elde etmek için metot içerir. Bu sayede birden fazla Iterator arayüzünü uygulayan sınıfların örneklerini elde edebiliriz.
ConcreteAggregate:Aggregate arayüzünü uygular ve Iterator arayüzünü uygulayan sınıf örneği üretir.
Senaryo olarak elimizde bir çalışan listesi olduğu ve bu liste üzerinde işlemler yapıldığı varsayılsın.
C# Kod Örneği:
// Liste üzerinde gezilecek olan elamnı temsil eden sınıf.classEmployee{publicint id;publicstring firstName;publicstring lastName;publicEmployee(int id,string firstName,string lastName) {this.id= id;this.firstName= firstName;this.lastName= lastName; }}
// Koleksiyon üzerinde dolaşmak için operasyonların tanımlandığı arayüzdür.// Bir sonraki elemana geçme, bir sonraki elemanın olup olmadığı gibi.// UML diyagramındaki Iterator arayüzüne denk gelmektedir.// Generic bir yapı sağlanarak birçok yerde kullanılması sağlanır.interfaceIIterator<T>{boolHasNext();TGetCurrentItem();}
// Iterator arayüzünü uygulayan sınıf örneklerini elde etmek için metot içerir.// Bu sayede çeşitli Iterator arayüzünü uygulayan sınıfların örneklerini elde edebiliriz.// UML diyagramındaki Aggregate arayüzüne denk gelmektedir.interfaceIEmployeeAggregate{IIterator<Employee> CreateIterator();}
// Aggregate (IEmployeeAggregate) arayüzünü uygular ve Iterator arayüzünü uygulayan sınıf örneği üretir.// Değerlerin referansları burada bulunur.// UML diyagramındaki ConcreteAggregate sınıfına denk gelmektedir.classEmployeeListAggregate:IEmployeeAggregate{privateList<Employee> _employees;publicEmployeeListAggregate() { _employees =newList<Employee>(); }publicvoidAdd(Employee employee) {_employees.Add(employee); }publicintCount() {return_employees.Count; }publicEmployeeGet(int index) {return_employees[index]; }publicIIterator<Employee> CreateIterator() {returnnewEmployeeIterator(this); }}
// Iterator arayüzünü ve koleksiyon üzerinde dolaşmak için gerekli metotları uygular.// Veriler üzerinde dolanma işlemleri burada gerçekleştirilecektir.// ConcreteAggregate (EmployeeListAggregate) sınıfı ile birlikte çalışırclassEmployeeIterator:IIterator<Employee>{privateEmployeeListAggregate _employeeListAggregate;privateint _currentIndex;publicEmployeeIterator(EmployeeListAggregate employeeListAggregate) { _employeeListAggregate = employeeListAggregate; _currentIndex =0; }publicEmployeeGetCurrentItem() {return_employeeListAggregate.Get(_currentIndex++); }publicboolHasNext() {if (_employeeListAggregate.Count() > _currentIndex) {returntrue; }returnfalse; }}