반복자(iterator) 패턴

컬렉션(리스트,스택, 트리등)을 노출하지 않고 순회하기 위한 패턴

실제 적용 예시

  • 복잡한 도시를 탐험하는 다양한 방식이 있습니다. 직접 포인트를 찍어가면서 돌아다니는 것이나, 네이버 지도로 간접적으로 탐험하는 방식 이런식으로 다양한 방식의 접근 방식을 정의하는것이 반복자 패턴입니다.
export interface Iterator {
    next(): any;
    hasNext(): boolean;
}

export interface Aggregator {
    createIterator(): Iterator;
}

export class ConcreteIterator implements Iterator {
    private collection: any[] = [];
    private position: number = 0;

    constructor(collection: any[]) {
        this.collection = collection;
    }

    public next(): any {
        // Error handling is left out
        var result = this.collection[this.position];
        this.position += 1;
        return result;
    }

    public hasNext(): boolean {
        return this.position < this.collection.length;
    }
}

export class Numbers implements Aggregator {
    private collection: number[] = [];

    constructor(collection: number[]) {
        this.collection = collection;
    }
    public createIterator(): Iterator {
        return new ConcreteIterator(this.collection);
    }
}

언제 사용할까 ?

보안등을 위해서 컬렉션 내부 데이터 구조를 숨기고 싶을때 사용합니다.

반복자 패턴으로 앱전체 순회를 줄입니다.

장점

  • 같은 컬렉션의 다양한 순회 방법을 지원하고 병렬로 순회할수 있다. 반복자는 고유의 순회 상태와 방법이 존재함
  • 순회를 지연할 수 있다.

단점

  • 데이터 구조(컬렉션 구조)가 단순한 경우 (반복자 생성은) 과도할 수 있다.
  • 직접 탐색 보다 효율적이지 않을 수 있다.