/* 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());
  }
  
 }
 
댓글 없음:
댓글 쓰기