본문으로 건너뛰기

디자인 패턴 중 이터레이터 패턴 (Iterator Pattern)

무료2015-03-07#Design_Pattern#迭代器模式#Iterator Pattern

이터레이터 패턴은 비교적 간단한 패턴으로, 쉽게 말해 이터레이터를 사용하여 순회 세부 사항을 캡슐화합니다. 컬렉션 객체는 대부분 순회 작업을 지원합니다 (Array, List, Set, Map 등). 하지만 각 컬렉션 객체의 내부 구현 방식이 다르기 때문에 순회 시 호출해야 하는 인터페이스도 다릅니다. 이터레이터는 컬렉션 객체에 통일된 인터페이스를 제공하여 순회 작업을 지원하기 위한 것입니다

no_mkd

一。이터레이터 패턴이란 무엇인가?

이터레이터를 사용하여 컬렉션 객체의 순회 세부 사항을 캡슐화하여, 호출자가 통일된 인터페이스를 통해 컬렉션의 순회를 실현할 수 있도록 합니다

이터레이터는 컬렉션 객체에 일정한 보호도 제공합니다. 컬렉션을 순회하고 싶다면 이터레이터의 메서드를 직접 호출하면 되며, 컬렉션 내부의 데이터 관리 방식을 알 필요도 없고 알 필요도 없습니다

二。예를 들다

현재 한 그룹의 커스텀 객체가 있다고 가정해 봅시다. 그것들이 어떤 컬렉션 객체로 유지되는지는 알 수 없습니다. Array, List 또는 기타일 수 있습니다. 우리의 작업은 이 한 그룹의 객체를 순회하는 것입니다 (또는 순회的基础上에 일부 추가 처리를 추가합니다). 어떻게 구현할지 생각해 봅시다?

먼저 컬렉션 객체의 타입을 판단하고, 각각 다르게 처리합니다. 모든 다른 컬렉션 타입에 대해, 다른 루프来处理해야 합니다. 이러한 루프 블록에는 미세한 차이만 있지만, 루프를 제공하여 처리해야 합니다..100 종의 다른 컬렉션 타입이 있다면, 아마도 100 개의 서로 비슷한 루프를 사용하여 순회를 구현해야 할 것입니다.无疑에 대량의 중복 코드가 존재합니다. 따라서 통일된 진입점이 필요하며, n 개의 루프를 매우 적응력이 높은 1 개의 루프로 바꾸고 싶습니다. 그렇다면 이터레이터가 바로 우리가 고대하던 통일된 진입점입니다:

이터레이터 인터페이스

package IteratorPattern;

/**

  • @author ayqy

  • 이터레이터 정의 */ public interface Iterator {

    /**

    • @return 컬렉션 내에 다음 요소가 존재하는지 여부 / public abstract boolean hasNext(); /*
    • @return 컬렉션 내의 다음 요소 반환 */ public abstract Object next(); }

일부 구체적인 이터레이터를 구현하여 순회 세부 사항을 구현해야 합니다:

Array 이터레이터:

package IteratorPattern;

/**

  • @author ayqy

  • 배열 이터레이터 구현 */ public class ArrayIterator implements Iterator{ MyObject[] arr;//커스텀 객체 배열 int index = 0;//현재 인덱스

    public ArrayIterator(MyObject[] arr){ this.arr = arr; }

    @Override public boolean hasNext() { if(index < arr.length && arr[index] != null) return true;

     return false;
    

    }

    @Override public Object next() { MyObject mo = arr[index]; index++;

     return mo;
    

    } }

P.S.Array 이터레이터의 hasNext 메서드의 구체적 구현에 주의하십시오

List 이터레이터:

package IteratorPattern;

import java.util.List;

/**

  • @author ayqy

  • List 이터레이터 구현 */ public class ListIterator implements Iterator{ List<MyObject> list;//컬렉션 객체 int index = 0;//현재 인덱스

    public ListIterator(List<MyObject> list){ this.list = list; }

    @Override public boolean hasNext() { if(index < list.size()) return true;

     return false;
    

    }

    @Override public Object next() { MyObject mo = list.get(index); index++;

     return mo;
    

    } }

이러한 구체적인 이터레이터가 있으면, 하나의 루프만으로 충분합니다:

/**
 * 컬렉션의 모든 내용 출력
 * @param iter 컬렉션의 이터레이터
 */
private static void printObjs(Iterator iter){
	while(iter.hasNext()){
		System.out.println(iter.next().toString());
	}
}

三。Java 의 Iterator 지원

이터레이터의 편리함과 필요성으로 인해, Java1.5 이후에는 Iterator 에 대한 지원을 제공하고 있습니다. 현재 많은 컬렉션 객체가 Iterator 를 지원합니다. 예를 들어 Set, List, Map, SortedSet, SortedMap, HashSet, TreeSet, ArrayList, LinkedList, Vector 등입니다

이터레이터를 지원하지 않는 유일한 것은 배열일 것입니다 (스택, 큐 이러한 특수한 것 제외). 위에서 커스텀 Iterator 인터페이스를 구현했지만, 실제로 Java 자체가 이 인터페이스를 제공합니다 (java.util.Iterator). 하지만 다른 점은:

Java.util.Iterator 인터페이스는 3 개의 메서드를 정의합니다 (hasNext, next 메서드 외에 remove 메서드도 있습니다):

컬렉션 객체가 remove 메서드를 제공하기 싫어도 관계없습니다. 예외를 던져 구현을 거부할 수 있습니다. 이렇게:

package IteratorPattern;

/**

  • @author ayqy

  • Java 가 제공하는 Iterator 인터페이스를 사용하여 배열 이터레이터 구현 */ public class JavaArrayIterator implements java.util.Iterator{ MyObject[] arr;//커스텀 객체 배열 int index = 0;//현재 인덱스

    public JavaArrayIterator(MyObject[] arr){ this.arr = arr; }

    @Override public boolean hasNext() { if(index < arr.length && arr[index] != null) return true;

     return false;
    

    }

    @Override public Object next() { MyObject mo = arr[index]; index++;

     return mo;
    

    }

    @Override public void remove() { //작업 지원되지 않음 예외 던짐 throw new UnsupportedOperationException(); } }

이터레이터 호출 방식은 완전히 변하지 않았습니다:

/**
 * 컬렉션의 모든 내용 출력
 * @param iter 컬렉션의 이터레이터
 */
private static void printObjs(java.util.Iterator iter){
	while(iter.hasNext()){
		System.out.println(iter.next().toString());
	}
}

四。이터레이터의 암묵적 호출

많은 언어가 for each(또는 for in) 루프를 지원하며, 그 내부 구현은 이터레이터를 호출하여 순회를 완료합니다. 물론, 이는 작은 상식에 불과합니다. 더 중요한 것은 이터레이터의 설계 원리를 배우고, 필요한 때에 자신의 이터레이터를 정의하는 것입니다

五。확장

이터레이터 패턴 자체는 비교적 간단하여, 더 이상 자신의 이터레이터를 정의할 필요조차 없습니다 (API 가 제공하는 이터레이터 인터페이스는 거의 우리의 요구를 충족시킵니다)

하지만 이터레이터와 컴포지트 패턴을 결합하면, 몇 가지 놀라운 일을 할 수 있습니다 (컴포지트 패턴에서 자세히 소개합니다.여기를 클릭하여 이동>>)

댓글

아직 댓글이 없습니다

댓글 작성