디자인패턴 : Iterator
반복자 디자인패턴
- 내부 표현부를 노출하지 않고 어떤 객체 집합에 속한 원소들을 순차적으로 접근할 수 있는 방법을 제공하는 패턴.
클래스 설명
리스트 등 집합 객체들은 이 내부 표현 구조를 노출하지 않고도 자신의 원소를 접근할 수 있는 방법을 제공한다. 반복자 객체를 나타내는 Iteratror 클래스는 현재 원소가 무엇인지 관리하고, 이미 방문한 원소들이 무엇인지 알고 있다. ListIterator 클래스의 인스턴스를 생성하기 전에 먼저 순회 주체가 되는 List 객체를 생성해야 한다. ListIterator 클래스의 인스턴스를 생성하고 나면 이를 이용해서 리스트 원소에 접근할 수 있게 된다. CurrentItem() 연산은 리스트의 현재 원소를 알아내는 연산이고, First() 연산은 현재 원소를 리스트 첫 번째 원소로 초기화하는 연산, Next()는 다음 원소를 순회 과정 중의 현재 원소로 지정하고, IsDone()은 순회할 원소가 더 있는지 없는지 확인하는 연산이다. 보통 객체 내부 표현 방식을 모르고도 집합 객체의 각 원소들에 접근하고 싶을 때, 집합 객체를 순회하는 다양한 방법을 지원하고 싶을 때, 서로 다른 집합 객체 구조에 대해서도 동일한 방법으로 순회하고 싶을 때 목적을 두고 있다.
클래스 사용방법
var aList: SampleList = new SampleList ();
var ltor: ListIterator = new ListIterator( aList );
for( ltor.first(); !ltor.isDone(); ltor.next() ) {
ltor.curentItem();
}
클래스 구성
//List 인터페이스
package
{
public interface List
{
function count(): Number;
function get( index: Number ): Item;
}
}
//List 서브클레스
package
{
public class SampleList implements List
{
public function SampleList()
{
}
public function count(): Number
{
}
public function get( index: Number ): Item
{
}
//이하 생략
}
}
//Iterator 인터페이스
package
{
public interface Iterator
{
function first(): void;
function next(): void;
function isDone(): Boolean;
function currentItem(): Item;
}
}
//Iterator 서브클레스
package
{
public class ListIterator implements Iterator
{
private var _list: List;
private var _current: Number = 0;
public function ListIterator( aList: List)
{
_list = alist;
}
public function first(): void
{
_current = 0;
}
public function next(): void
{
_current++;
}
public function isDone(): Boolean
{
return _current >= _list.count();
}
public function currentItem(): Item
{
if( isDone() ) {
throw new Error("Not exist a Selected Item");
}
return _list.get( _current );
}
}
}