Iterator

GOF Intent:
Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.

اين Pattern به نام Cursor نيز خوانده مي شود.

گاهي در برنامه با ليست هاي گوناگوني از Object هاي مختلف سر و کار داشته باشيم. هر کدام از اين ليست ها به گونه خاصي پياده سازي مي شوند و جزئيات هريک با ديگري متفاوت است.

در اين شرايط اگر Iterator Pattern استفاده شود نتيجه اش اين است که کاربر، براي پيمايش اين ليست ها، بدونه اينکه درگير جزئيات شود، از يک سري متدهاي از پيش تعيين شده براي عملياتي همچون next، Previous و غيره روي همه ليست ها استفاده مي‌کند.

در ساختار بالا Aggregate کلاسي است که ليست اصلي را در خود نگه مي دارد و بايد مورد پيمايش قرار گيرد.

نمونه کد:

public interface Iterator {
   public void first();
   public void next();
   public boolean hasNext(); // isDone
   public String currentItem();
}


public interface Aggregate {
   public Iterator CreateIterator();
   public void addItem(String item);
}


public class ConcreteIterator implements Iterator{
   private ArrayList<String> list;
   private int currentPosition = 0;

   public ConcreteIterator(ArrayList<String> list){
      this.list = list;
   }

   public void first() {
      currentPosition = 0;
   }

   public void next() {
      if (currentPosition < list.size())
         currentPosition++;
   }

   public boolean hasNext() {
      if (currentPosition < list.size())
         return true;
      else
         return false;
   }

   public String currentItem() {
      return list.get(currentPosition);
   }
}


public class ConcreteAggregate implements Aggregate{

   private ArrayList<String> aggregatelist = new ArrayList<String>();

   public Iterator CreateIterator() {
      return new ConcreteIterator(aggregatelist);
   }

   public void addItem(String item) {
      aggregatelist.add(item);
   }
}


public static void run(){

   Aggregate a = new ConcreteAggregate();

   a.addItem(“Item1″);
   a.addItem(“Item2″);
   a.addItem(“Item3″);
   a.addItem(“Item4″);
   a.addItem(“Item5″);

   Iterator i = a.CreateIterator();

   while (i.hasNext()){
      System.out.println(i.currentItem());
      i.next();
   }
}

برخي از زبانها تمهيداتي براي اين Pattern در نظر گرفته اند. از جمله در جاوا interface پيش فرضي براي iterator داريم که در صورت لزوم مي توان آن را implement کرد.
java.util.Iterator

اين interface اي است که signature متدهاي زير در آن وجود دارد:
hasNext()
next()
remove()


برخي از ليست هاي موجود در جاوا از جمله ArrayList، کلاس Iterator خود را پياده سازي کرده اند.

مثال:

ArrayList<String> list = new ArrayList<String>();

list.add(“item1″);
list.add(“item2″);
list.add(“item3″);

for (Iterator<String> it = list.iterator(); it.hasNext();) {
   System.out.println(it.next());
}



منبع ها:

  1. Design Patterns – Elements of Reusable Object Oriented Software (GOF) By Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
  2. Design Patterns for dummies, By Steve Holzner
  3. Iterator in Devlake

پست شده در Design Pattern

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*


1 × = یک

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

تماس با من: admin@paspars.com