Iterator Pattern

윤세영·2023년 7월 6일
0

DesignPattern

목록 보기
5/15

정의

  • collection의 구현을 드러내지 않으면서도 collection에 있는 모든 object에 대해 반복 작업을 할 수 있다.
  • Interface를 통해서 Array List, HashTable 등 서로 다른 집합 객체 구조에 대해서도 반복자를 구현할 수 있다.

장점

  • 리스트 등의 객체의 코드가 수정되어도 순회하는 코드에 영향이 없다.
  • 하나의 리스트 등 의 집합객체에 여러가지 순회방법을 정할 수 있다.
  • Iterator는 aggregate class의 interface를 단순화

순서

  • 클래스 정의
  • 반복자 정의 (요소를 순서대로 검색해가는 API 결정)
  • 집합객체 정의 (Aggregate이 결정한 interface를 실제로 구현)
  • Aggregate 정의 (리스트에 새로운 항목을 추가하거나 삭제)
  • 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

profile
Frontend

0개의 댓글