2013년 9월 12일 목요일

[7주차 5일] Design Pattern - Iterator Pattern

/* Iterator 패턴
 * - 창고로부터 값을 꺼내는 방법을 객체화
 * - 값을 꺼내려는 개발자는 일관된 방식으로 메서드를 호출하여 값을 꺼낼 수 있다.
 * - 예)
 * 저장소: [ , , , , , , ]
 *
 * AscendentIterator : 값을 앞에서 부터 뒤로 순자적으로 꺼낸다.
 * DescendantIterator : 값을 뒤에서 앞으로 순차적으로 꺼낸다.
 * EvenIterator : 짝수번째 값만 순차적으로 꺼낸다.
 *
 * 프로그램의 일관성을 위해서 모든 꺼내는 역할자는 다음의 규칙을 따른다.
 * - hasNext() : 꺼낼게 있냐?
 * - next() : 꺼내라!
 */

interface Iterator {
boolean hasNext();
Object next();
}

class AscendentIterator implements Iterator {
ArrayList list;
int cursor;

public AscendentIterator(ArrayList list) {
this.list = list;
this.cursor = 0;
}

@Override
public boolean hasNext() {
if (cursor < list.size()) {
return true;
} else {
return false;
}
}

@Override
public Object next() {
Object value = list.get(cursor);
cursor++;
return value;
}
}

class DecendantIterator implements Iterator {
ArrayList list;
int cursor;

public DecendantIterator(ArrayList list) {
this.list = list;
this.cursor = list.size() - 1;
}

@Override
public boolean hasNext() {
if (cursor > 0) {
return true;
} else {
return false;
}
}

@Override
public Object next() {
Object value = list.get(cursor);
cursor--;
return value;
}
}

class EvenIterator implements Iterator {
ArrayList list;
int cursor;

public EvenIterator(ArrayList list) {
this.list = list;
this.cursor = 0;
}

@Override
public boolean hasNext() {
if (cursor < list.size()) {
return true;
} else {
return false;
}
}

@Override
public Object next() {
Object value = list.get(cursor);
cursor += 2;
return value;
}
}



public class IteratorTest {

public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("1111");
list.add("2222");
list.add("3333");
list.add("4444");
list.add("5555");
list.add("6666");
list.add("7777");
list.add("8888");
list.add("9999");

// Iterator iterator = new AscendentIterator(list);
Iterator iterator = new DecendantIterator(list);
// Iterator iterator = new EvenIterator(list);
while ( iterator.hasNext()) {
System.out.println(iterator.next());
}

}

댓글 없음:

댓글 쓰기