Iterator Pattern (반복자 패턴)

Iterator Pattern


 

정의


collection의 구현을 드러내지 않으면서도 collection에 있는 모든 object에 대해 반복 작업을 할 수 있다.


Interface를 통해서 Array List, HashTable 등 서로 다른 집합 객체 구조에 대해서도 반복자를 구현할 수 있다.

 



장점


1.    리스트 등의 객체의 코드가 수정되어도 순회하는 코드에 영향이 없다.


2.    하나의 리스트 등 의 집합객체에 여러가지 순회방법을 정할 수 있다.


3.    Iteratoraggregate classinterface를 단순화



 

순서


1.    클래스 정의


2.    반복자 정의 (요소를 순서대로 검색해가는 API 결정)


3.    집합객체 정의 (Aggregate이 결정한 interface를 실제로 구현)


4.    Aggregate 정의 (리스트에 새로운 항목을 추가하거나 삭제)


5.    Iterator class를 재정의 하는 iterator (리스트상의 현재 위치를 조정)



 


소스코드

 

Aggregate

public interface Aggregate {

         public abstract Iterator iterator();

}

 

Food

public class Food {
         private String name;    
         public Food(String name){
                 this.name = name;
         }
         public String getName(){
                 return name;
         }
}

 

FoodBook

public class FoodBook implements Aggregate{
         private Food[] foods;
         private int last=0;
         public FoodBook(int maxsize){
                 this.foods = new Food[maxsize];
         }
         public Food getFoodAt(int index){
                 return foods[index];
         }
         public void appendFood(Food food){
                 this.foods[last] = food;
                 last++;
         }
         public int getLength(){
                 return last;
         }
         @Override
         public Iterator iterator() {
                 // TODO Auto-generated method stub
                 return new FoodBookIterator(this);
         }
}


Iterator

public interface Iterator {
         public abstract boolean hasNext();
         public abstract Object next();
}

 

FoodBookIterator

public class FoodBookIterator implements Iterator{
         private FoodBook foodBook;
         private int index;       
         public FoodBookIterator(FoodBook foodBook) {
                 // TODO Auto-generated constructor stub
                 this.foodBook=foodBook;
                 this.index=0;
         }
         @Override
         public boolean hasNext() {
                 return index < foodBook.getLength();
         }
         @Override
         public Object next() {
                 Food food = foodBook.getFoodAt(index);
                 index++;
                 return food;
         }
}

 

Main

public class Main {
         public static void main(String[] args) {
                 FoodBook foodBook = new FoodBook(4);             
                 foodBook.appendFood(new Food("kimchi"));
                 foodBook.appendFood(new Food("bulgogi"));
                 foodBook.appendFood(new Food("bibimbab"));
                 foodBook.appendFood(new Food("pizza"));
                 
                 Iterator iterator = foodBook.iterator();
                 
                 while(iterator.hasNext()){
                          Food food = (Food)iterator.next();
                          System.out.println(food.getName());
                 }
         }
}



UML