iterator

GamSa Ham·2022년 11월 10일
0

GoF디자인패턴

목록 보기
12/22

의도

내부 표현부를 노출하지 않고 어떤 집합 객체에 속한 원소들을 순차적으로 접근할 수 있는

방법을 제공

활용성

  • 객체 내부 표현 방식을 모르고도 집합 객체의 각 원소들에 접근하고 싶을 때
  • 집합 객체를 순회하는 다양한 방법을 지원하고 싶을 때
  • 서로 다른 집합 객체 구조에 대해서도 동일한 방법으로 순회하고 싶을 때

구조

참여자

  • Iterator: 원소를 접근하고 순회하는 데 필요한 인터페이스 제공
  • ConcreteIterator: Iterator에 정의된 인터페이스 구현체, 순회 과정 중 집합 객체 내에서 현재 위치를 기억한다.
  • Aggregate: Iterator 객체를 생성하는 인터페이스를 정의
  • ConcreteAggregate: 해당하는 ConcreteIterator의 인스턴스를 반환하는 Iterator 생성 인터페이스 구현

예제코드

public class Item {

    private String name;
    private int price;

    public Item(String name, int price) {
        this.name = name;
        this.price = price;
    }

    @Override
    public String toString() {
        return "Item{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}
//Aggregate
public interface Aggregate<T> {

    Iterator<T> createIterator();
}

public class ConcreteAggregate implements Aggregate<Item> {

    private List<Item> itemList;

    public ConcreteAggregate(List<Item> itemList) {
        this.itemList = itemList;
    }

    @Override
    public Iterator<Item> createIterator() {
        return new ItemIterator(itemList);
    }
}
//Iterator
public interface Iterator<E> {

    boolean hasNext();

    E next();
}

public class ItemIterator implements Iterator<Item> {

    private List<Item> itemList;
    private int index = 0;

    public ItemIterator(List<Item> itemList) {
        this.itemList = itemList;
    }

    @Override
    public boolean hasNext() {
        return index < itemList.size();
    }

    @Override
    public Item next() {
        if (hasNext()) {
            return itemList.get(index++);
        }
        return null;
    }
}
public class Main {
    public static void main(String[] args) {

        Item item1 = new Item("item1", 10000);
        Item item2 = new Item("item2", 20000);
        Item item3 = new Item("item3", 30000);

        List<Item> itemList = new ArrayList<>();

        itemList.add(item1);
        itemList.add(item2);
        itemList.add(item3);

        Aggregate<Item> c = new ConcreteAggregate(itemList);

        Iterator<Item> myIter = c.createIterator();

        while (myIter.hasNext()) {
            System.out.println(myIter.next());
        }
    }
}
Item{name='item1', price=10000}
Item{name='item2', price=20000}
Item{name='item3', price=30000}
profile
안녕하세요. 자바를 좋아하고 디자인 패턴, Refactoring, Clean Code에 관심이 많은 백엔드 개발자입니다.

0개의 댓글