정의

내부를 노출하지 않고, 어떤 객체 집합에 속한 원소들을 순차적으로 접근할 수 있는 방법을 제공하는 패턴.

실제 리스트를 구성하는 항목을 관리하기 위한 List 클래스와는 별도로 List 클래스 객체 내의 항목들을 접근하기 위한 별도의 클래스를 정의해서 사용하는 방식

   

인터페이스

Aggregate 클래스

Count() : 자료 객체의 개수를 리턴

AddNext( Element ) : 리스트에 새로운 항목을 추가 (여기서는 새로운 학생과 점수겠죠?)

Remove( Element ) : 지정 항목을 삭제한다.

GetElement(num) : 특정 번지수의 자료포인터를 얻는다.

Iterator 클래스

First() : 맨 처음 자료로 이동

Next() : 다음 자료로 이동

IsDone() : 자료가 맨 마지막에 왔나 검사

GetCurElement() : 위의 함수들로 이동된 위치에 있는 자료 포인터 리턴

소스

그림을 클릭하면 크게 보입니다.

  

구현 시 고려 사항

Element 클래스는 리스트나 트리를 구성하는 항목에 대한 자료형으로 얼마든지 다른 자료형으로 정의가 가능

노드 삽입 함수( AddNext )의 매개변수는 2개인데, 첫 번째 인자는 삽입할 인자, 두 번째 인자는 새로 삽입되는 객체와 연결되는 기존 객체이다. 이같이 2개의 인터페이스를 제공하는 이유는 트리와 같은 경우 형제 노드로 삽입하는 것이 필요하기 때문이다.

Iterator 클래스는 리스트나 트리에서 Iterator 객체가 현재 가리키고 있는 항목을 직접 참조하는 형식이 아니다. 대신 각 항목들의 위치 정보를 정수로 기록하고 있다. 이로 인해 GetCurElement가 실행될 경우 위치를 찾기 위해 처음부터 현재 위치까지 찾아야 하는 번거로움이 있다. 하지만 장점으로 다른 Iterator 객체에 의해 내가 현재 참조하고 있던 항목이 삭제 되도 프로그램 동작엔 이상이 없다.

Proxy 패턴을 활용해서 사용이 끝난 Iterator 객체는 자동 소멸되게 할 수 있다.

Iterator와 Aggrate 두 개의 클래스 간에 Friend 클래스로 정의해서 사용할 수도 있다. Friend 클래스는 주로 한 객체가 다른 객체의 내부 자료구조를 직접 다룰 필요가 있을 경우에 사용된다.

   

리스트 및 트리 객체 내의 항목에 접근하는 방법에는 2가지가 있다.

이 중 External Iterator은 Client가 항목에 대한 접근을 수행하는 것이고, Internal Iterator은 Iteraotr가 자체적으로 각 항목을 순차적으로 접근해서 작업을 수행하는 형태다. 상대적으로 Client가 임의로 접근 순서를 제어할 수 있는 External Iterator이 유연하고, Internal Iterator이 상대적으로 유연하지 않지만 리스트나 트리같은 로직의 재사용이 가능하다는 장점을 가지고 있다. 위에서 보여준 소스는 Internal Iterator 구조이다.

   

주위점

순환참조를 한다.

   

패턴 활용처

객체 내부 표현 방식을 모르고도 집합 객체의 각 원소들에 접근하고 싶을 때

집합 객체를 순회하는 다양한 방법을 지원하고 싶을 때

서로 다른 집합 객체 구조에 대해서도 동일한 방법으로 순회하고 싶을 때

   

장점

리스트를 구성하는 구체적인 자료구조가 List 클래스 객체 내로 숨겨진다.

동일한 리스트의 서로 다른 위치를 동시에 접근하는 것이 가능

리스트 내의 항목들을 접근하는 정책을 바꾸고 싶을 경우에 유용

클래스 구조를 확장함으로써 여러 가지 다양한 자료구조에 적용 가능

Iterator는 Aggregate 클래스의 인터페이스를 단순화

자료형으로 얼마든지 다른 형태로 정의가 가능하다. ( 이 부분에서 자료형은 template 기법을 사용할 수도 있다. )

Composite 패턴 Aggregate 객체 내의 항목 구성 시 사용될 수 있다.

Memento 패턴은 Iterator 객체 내부에 현재 항목의 위치 정보 등을 저장, 관리할 때 유용하게 사용할 수 있다. 이때 Memento 객체는 Iterator 객체 내부에 존재하게 된다.

   

마지막으로 STL과 같은 라이브러리에서는 대부분의 클래스에 Iterator 객체를 생성할 수 있도록 지원해 준다. 만일 Iterator 패턴을 충분히 이해하고 활용하면 보다 간경할 소프트웨어 개발이 가능해진다.

'1. 디자인패턴 > Behavioral 정리' 카테고리의 다른 글

Observer(감시자)패턴  (0) 2012.12.09
Memento(머멘토) 패턴  (0) 2012.12.08
Mediator(중재자) 패턴  (0) 2012.12.08
Iterator(반복자) 패턴  (0) 2012.12.07
Command(명령) 패턴  (0) 2012.12.06
Chain of Responsibility (책임 연쇄 패턴)  (0) 2012.12.05
Posted by 싹쓰리

댓글을 달아 주세요