Wednesday, 27 April 2016

Iterator Design Pattern

Iterator Design Pattern

This design pattern provides a way to access the elements of an aggregate object sequentially without exposing its underlying representation. It also places the task of the traversal, not on the aggregator, but on the internal implementer.

E.g. :If there are 2 lists with similar objects to iterate, and one uses the arrays and other uses a linklist, use this design pattern.



public interface I_ItemHolder {
     
      public I_Iterator createIterator();

}
public interface I_Iterator {
     
      public boolean hasNext();
      public Item next();

}
public class List_ItemHolder implements I_ItemHolder {

      private List<Item> items;   
     
      public List_ItemHolder(List<Item> items) {
            super();
            this.items = items;
      }

      @Override
      public I_Iterator createIterator() {
            return new List_Iterator(items.iterator());
      }
     
      class List_Iterator implements I_Iterator {
           
            private Iterator<Item> it;
           
            public List_Iterator(Iterator<Item> it) {
                  this.it = it;
            }

            @Override
            public boolean hasNext() {
                  return it.hasNext();
            }

            @Override
            public Item next() {
                  return it.next();
            }
           
      }

}

public class Array_ItemHolder implements I_ItemHolder {

      private Item[] items; 
     
      public Array_ItemHolder(Item[] items) {
            super();
            this.items = items;
      }

      @Override
      public I_Iterator createIterator() {
            return new Array_Iterator(this.items);
      }
     
      class Array_Iterator implements I_Iterator {
           
            private int index = -1;
            private Item[] items;
           
            public Array_Iterator(Item[] items) {
                  this.items = items;
            }

            @Override
            public boolean hasNext() {
                  if(items.length > (index+1)) {
                        return true;
                  } else {
                        return false;
                  }
            }

            @Override
            public Item next() {
                  return items[++index];
            }
           
      }

}

public class Item {
     
      private String name;
      private int age;

      public Item(String name, int age) {
            super();
            this.name = name;
            this.age = age;
      }
      public String getName() {
            return name;
      }
      public int getAge() {
            return age;
      }
     
      @Override
      public String toString() {
            return "Name : "+name+" Age : "+age;
      }
}
public class MainClass {

      public static void main(String[] args) {
            Item it1 = new Item("John",22);
            Item it2 = new Item("Rebecca",25);
            Item it3 = new Item("Andrew",26);
           
            List <Item> itemList = new ArrayList<Item>();
            itemList.add(it1);itemList.add(it2);itemList.add(it3);
           
            Item[] itemArray = {it1,it2,it3};
           
            System.out.println("---Using List Item Holder---");
            I_ItemHolder ith = new List_ItemHolder(itemList);
            I_Iterator ii = ith.createIterator();
            while(ii.hasNext()) {
                  System.out.println(ii.next());
            }
            System.out.println("---Using Array Item Holder---");
            ith = new Array_ItemHolder(itemArray);
            ii = ith.createIterator();
            while(ii.hasNext()) {
                  System.out.println(ii.next());
            }

      }

}


Code link : https://github.com/sksumit1/DesignPatterns

No comments:

Post a Comment