정의
- collection의 구현을 드러내지 않으면서도 collection에 있는 모든 object에 대해 반복 작업을 할 수 있다.
- Interface를 통해서 Array List, HashTable 등 서로 다른 집합 객체 구조에 대해서도 반복자를 구현할 수 있다.
장점
- 리스트 등의 객체의 코드가 수정되어도 순회하는 코드에 영향이 없다.
- 하나의 리스트 등 의 집합객체에 여러가지 순회방법을 정할 수 있다.
- Iterator는 aggregate class의 interface를 단순화
순서
- 클래스 정의
- 반복자 정의 (요소를 순서대로 검색해가는 API 결정)
- 집합객체 정의 (Aggregate이 결정한 interface를 실제로 구현)
- Aggregate 정의 (리스트에 새로운 항목을 추가하거나 삭제)
- Iterator class를 재정의 하는 iterator (리스트상의 현재 위치를 조정)
소스코드
public interface Aggregate {
public abstract Iterator iterator();
}
public class Food {
private String name;
public Food(String name){
this.name = name;
}
public String getName(){
return name;
}
}
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() {
return new FoodBookIterator(this);
}
}
public interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
}
public class FoodBookIterator implements Iterator{
private FoodBook foodBook;
private int index;
public FoodBookIterator(FoodBook foodBook) {
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;
}
}
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