Iterator Pattern (반복자 패턴)
Iterator Pattern
정의
collection의 구현을 드러내지 않으면서도 collection에 있는 모든 object에 대해 반복 작업을 할 수 있다.
Interface를 통해서 Array List, HashTable 등 서로 다른 집합 객체 구조에 대해서도 반복자를 구현할 수 있다.
장점
1. 리스트 등의 객체의 코드가 수정되어도 순회하는 코드에 영향이 없다.
2. 하나의 리스트 등 의 집합객체에 여러가지 순회방법을 정할 수 있다.
3. Iterator는 aggregate class의 interface를 단순화
순서
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
'SW > DesignPattern' 카테고리의 다른 글
State Pattern (스테이트 패턴) (0) | 2017.09.15 |
---|---|
Composite Pattern (컴포지트 패턴) (0) | 2017.09.15 |
Template Method Pattern (템플릿메소드패턴) (0) | 2017.09.11 |
Facade Pattern (퍼사드 패턴) (0) | 2017.09.07 |
Adapter Pattern (어댑터 패턴) (0) | 2017.09.07 |