정의 : 객체의 내부 세부 사항을 노출시키지 않고 컨테이너 객체의 다양한 요소에 액세스하는 방법을 제공합니다.
유형 : 행동 패턴
클래스 다이어그램 :
Java에서 가장 일반적으로 사용되는 모드를 묻고 싶다면 대답은 싱글 톤 모드 나 공장 모드 나 전략 모드가 아니라 반복자 모드입니다. 먼저 코드를 살펴 보겠습니다.
public static void print (collection coll) {iterator it = coll.iterator (); while (it.hasnext ()) {string str = (string) it.next (); System.out.println (str); }} 이 방법의 기능은 String Collection 루프를 인쇄하는 것이며 반복자 패턴은 반복자 패턴에 사용됩니다. Java 언어는 반복자 패턴을 완전히 구현했습니다. 반복자는 중국어로 번역되어 반복자를 의미합니다. 반복자와 관련하여 우선 세트와 관련이 있습니다. 세트는 골재, 컨테이너 등이라고도합니다. 세트를 객체를 포함 할 수있는 컨테이너로 간주 할 수 있습니다. 예를 들어, 목록, 세트, 맵 및 배열을 세트라고 할 수 있습니다. 반복자의 기능은 컨테이너의 물체를 하나씩 통과하는 것입니다.
반복자 패턴의 구조
초록 컨테이너 : 일반적으로 컬렉션 인터페이스, 목록 인터페이스, 인터페이스 세트 등과 같은 iterator () 메소드가 제공됩니다.
특정 컨테이너 : ArrayList를 구현하기위한 목록 인터페이스의 순서 목록, LinkList를 구현하기위한 링크 된 목록 인터페이스, 해시 세트를 구현하기위한 세트 인터페이스 목록 등의 구체적인 구현 클래스입니다.
초록 반복자 : 요소를 가로 지르는 데 필요한 방법을 정의합니다. 일반적으로 세 가지 방법이 있습니다. 첫 번째 요소의 첫 번째 () 메소드를 가져오고 다음 요소의 다음 () 메소드를 가져오고 Traversal의 메소드가 isdone (또는 hasnext ()), 현재 객체의 제거 ()를 종료하는지 여부를 결정합니다.
반복자 구현 : 컬렉션의 반복을 완료하기 위해 반복자 인터페이스에 정의 된 메소드를 구현합니다.
예를 들어보세요
반복자 모드 자체의 규정은 상대적으로 느슨하기 때문에 특정 구현은 다양합니다. 여기서 한 가지 예제 만 제공하겠습니다. 구현 방법을 하나씩 제시 할 수 없습니다. 따라서 예제를 제시하기 전에 다음 반복자 패턴의 구현 방법을 나열하겠습니다.
1. 반복자 역할은 트래버스의 인터페이스를 정의하지만 반복을 제어하는 사람을 지정하지 않습니다. Java Collection을 적용 할 때 Traversal 프로세스는 외부 반복자라고하는 클라이언트 프로그램에 의해 제어됩니다. 또 다른 구현 방법은 반복자 자체를 제어하는 것이며 (내부 반복자라고합니다. 외부 반복자는 내부 반복자보다 유연하고 강력하며 Java Locale 환경에서는 내부 반복기가 매우 약합니다.
2. 반복자 모드에서 트래버스 알고리즘을 구현할 사람에 대한 조항은 없습니다. 반복자 역할에서 구현하는 것은 당연한 것 같습니다. 컨테이너에서 다른 트래버스 알고리즘을 사용하는 것이 편리하기 때문에 다른 컨테이너에 트래버스 알고리즘을 적용하는 것이 편리합니다. 그러나 이것은 컨테이너의 캡슐화를 파괴합니다. 컨테이너 역할은 자체 개인 속성을 공개해야합니다. 이는 자바에서 자체 개인 속성을 다른 클래스에 노출시키는 것을 의미합니다.
그런 다음 컨테이너 역할에 넣어 구현합시다. 이런 식으로, 반복자 역할은 현재 위치를 가로 지르는 함수 만 저장하기 위해 재정의됩니다. 그러나 Traversal 알고리즘은 특정 컨테이너에 단단히 연결되어 있습니다.
Java Collection의 적용에서 제공된 특정 반복자 역할은 컨테이너 역할에 정의 된 내부 클래스입니다. 이것은 컨테이너의 포장을 보호합니다. 그러나 동시에 컨테이너는 트래버스 알고리즘 인터페이스를 제공하며 고유 한 반복기를 확장 할 수 있습니다.
자, Java Collection의 반복자가 어떻게 구현되는지 살펴 보겠습니다.
// 반복자 역할은 트래버스 인터페이스 공개 인터페이스 반복을 정의합니다. {boolean hasnext (); 객체 다음 (); void remove ();} // 컨테이너 역할, 여기에서 예제로 목록을 가져갑니다. 단지 인터페이스이므로 나열되지 않습니다. 특정 컨테이너 역할은 ArrayList 및 목록 인터페이스를 구현하는 기타 클래스입니다. 핵심 요점을 강조하기 위해 반복자와 관련된 내용을 참조하십시오. // 특정 반복자 역할은 내부 클래스 형태로 도출됩니다. 각 특정 컨테이너 역할의 공통 부분을 추출하기 위해 AbstractList가 있습니다. public acplart class actractlist는 actractCollection 구현 목록을 확장합니다. {... // 이것은 특정 반복자 역할을 생성하는 공장 메소드입니다. public iterator () {return new itr ();} // 내부 클래스 ITR의 특정 반복자 역할 iterator {int cursor = 0; int lastret = -1; int exclingModCount = modCount; public boolean hasnext () {return cursor! = size (); } public Object Next () {checkforcomodification (); try {object next = get (cursor); lastret = 커서 ++; 다음으로 돌아갑니다. } catch (indexOutOfBoundSexection e) {checkforcomodification (); 새로운 nosuchelementexception ()을 던지십시오. }} public void remove () {if (lastret == -1) 새로운 불법 스테이트 렉스크 () 던지기; CheckforComodification (); try {acpractList.this.remove (lastret); if (lastret <cursor) 커서-; lastret = -1; 예상 modCount = modCount; } catch (indexOutOfBoundSexception e) {throw new concurrentModificationException (); }} Final void checkforcomodification () {if (modCount! = excliteModCount) 새 concurrentModificationException (); }}반복자 모드 사용에 관해서. 소개에 나열된 바와 같이, 클라이언트 프로그램은 먼저 특정 컨테이너 역할을 얻은 다음 특정 컨테이너 역할을 통해 특정 반복 역할을 얻어야합니다. 이렇게하면 특정 반복자 역할을 사용하여 컨테이너를 가로 질러 ...
반복자 모드의 장단점
반복 모드의 장점은 다음과 같습니다.
트래버스 방법이 단순화되었으며 객체 수집을 통과하는 것은 여전히 매우 번거 롭습니다. 배열 또는 주문 목록의 경우 커서를 통해 계속 얻을 수 있지만 사용자는 컬렉션에 대한 명확한 이해를 가지고 있다는 전제로 객체를 스스로 통과해야합니다. 그러나 해시 테이블의 경우 사용자를 가로 지르는 것이 더 번거 롭습니다. 반복자 방법을 도입 한 후 사용자가 사용하기가 훨씬 쉽습니다.
순서 대상 목록과 같은 여러 가지 방법이 있습니다. 필요에 따라 2 개의 반복자에게 양수 순서와 역 순서 트래버스를 제공 할 수 있습니다. 사용자는 컬렉션을 쉽게 통과하기 위해 구현 한 반복기 만 얻어야합니다.
캡슐화는 양호하며 사용자는 반복자가 트래버스를 가져 오기 만하면되지만 Traversal 알고리즘에 대해 걱정할 필요는 없습니다.
반복자 패턴의 단점 :
간단한 횡단 (예 : 배열 또는 주문 목록)의 경우 반복자를 사용하는 것이 더 성가신 일이며, Arraylist와 같이 루프에 사용하고 컬렉션을 통과하는 방법을 얻는다고 느낄 수 있습니다.
반복자 모드에 적용 가능한 시나리오
반복자 패턴은 컬렉션으로 공생적이고 죽음입니다. 일반적으로 컬렉션을 구현하는 한 컬렉션, 목록, 세트, 맵 등과 같이 컬렉션의 반복자를 동시에 제공해야합니다. 이러한 새 컨테이너를 구현하려면 물론 컨테이너의 반복기를 구현하기 위해 반복자 패턴을 도입해야합니다.
그러나 컨테이너와 반복자 간의 관계가 너무 가깝기 때문에 대부분의 언어는 컨테이너를 구현할 때 반복자를 제공하며 이러한 언어가 제공하는 컨테이너 및 반복자는 대부분의 경우 우리의 요구를 충족시킬 수 있습니다. 따라서 반복자 패턴을 스스로 연습하는 것은 비교적 드 rare니다. 기존 컨테이너와 반복자를 언어로만 사용하면됩니다.