반복자 패턴의 구조 :
반복 하위 패턴은 집계 된 내부 표현을 노출시키지 않고 순차적으로 집계 된 요소에 액세스 할 수 있습니다.
반복은 외부 반복 및 내부 반복 으로 나눌 수 있습니다.
외부 반복자 : 흰색 상자 집계에 적합합니다 (흰색 상자 집계는 외부 세계에 내부 요소 인터페이스에 액세스하는 집계를 제공하는 것입니다). 반복 논리는 집계 객체 자체에 의해 제공되기 때문에, 그러한 외부 반복자 서브 롤은 종종 반복의 커서 위치 만 유지합니다. 따라서, 특정 반복 하위 롤은 외부 클래스이며, 생성자는 특정 집계 객체를 수용 하여이 집계 객체의 반복 논리를 호출 할 수 있도록합니다.
내부 반복자 : 블랙 박스 집계에 적합합니다 (블랙 박스 집계는 외부의 인터페이스를 제공하여 자체 요소 객체를 가로 지르지 않습니다). 블랙 박스로 수집 한 요소 객체는 집계 된 내부 멤버에 의해서만 액세스 할 수 있으므로 내부 반복기는 집계 내부의 멤버의 서브 클래스 일 수 있습니다.
간단한 데모 :
패키지 test.edu.inter; 공개 인터페이스 iteratorobj { / *** 첫 번째 요소로 이동* / public void first (); / *** 다음 요소로 이동*/ public boolean hasnextitem (); / *** 현재 요소를 반환*/ public object currentItem (); } 패키지 test.edu.inter; 공개 인터페이스 데이터 세트 {public iteratorobj getIterator (); } 패키지 test.edu.inter; 공개 클래스 iterator1은 iteratorobj {private dataobj set; 개인 INT 크기; 개인 int index = 0; public iterator1 (dataobj set) {this.set = set; this.size = set.getSize (); } @override public void first () {// todo 자동 생성 메소드 Stub this.index = 0; } @override public boolean hasnextitem () {if (index <size) {return true; } false를 반환합니다. } @Override public Object CurrentItem () {Object Ob = set.getItem (index); if (index <size) {index ++; } 반환 OB; }} 패키지 test.edu.inter; 공개 클래스 DataObj는 데이터 세트를 구현합니다. {private object [] objarray = null; / *** 수용 집계 객체*/ public dataObj (Object [] objarray) {this.objarray = objarray; } @override public iteratorobj getIterator () {return new iterator1 (this); } public object getItem (int index) {return objarray [index]; } public int getsize () {return objarray.length; }} 패키지 test.edu.inter; 공개 클래스 클라이언트 { / ** * @param args * / public static void main (String [] args) {// todo 자동 생성 메소드 스터브 문자열 [] str = { "12312", "dasda", "dasd", "12d", "asd"}; dataobj ao = 새로운 dataobj (str); iteratorobj io = ao.getiterator (); while (io.hasnextitem ()) {system.out.println (io.currentitem ()); }}} 실행 결과 :
12312 DASDA DASD 12D ASD
컨텐츠 확장 : Java 집계의 응용 프로그램
iterator () 팩토리 메소드는 java.util.collection 인터페이스에 제공되어 반복자 유형 객체를 반환합니다. 컬렉션 인터페이스의 하위 유형 인 내부 멤버 클래스 ITR은 반복자 인터페이스를 구현합니다. 따라서 ITR은 본질적인 반복 서브 클래스이지만 AbstractList는 자체 트래버스 방법을 제공하므로 블랙 박스 집계가 아니라 흰색 상자 집계입니다. 코드는 다음과 같습니다.
import java.util.iterator; public interface itr 확장 반복자 {// 다음 () 메소드를 호출 할 때 사용되는 표시기 int cursor = 0; // 마지막 통화에 사용 된 표시기 lastret = -1; int exclingModCount = modCount; public boolean hasnext () {return cursor! = size (); } public Object Next () {try {Object Next = get (cursor); CheckforComodification (); lastret = 커서 ++; 다음으로 돌아갑니다. } catch (indexOutOfBoundSexection e) {checkforcomodification (); 새로운 nosuchelementexception ()을 던지십시오. }} // 마지막 트래버스 요소를 삭제하면 remove () 메소드는 마지막 트래버스 요소 만 삭제할 수 있습니다. 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 (); }} public void checkforcomodification () {if (modCount! = excliteModCount) 새 new concurrentModificationException (); }} ModCount, Get (Cursor)와 같은 변수 및 메소드는 모두 AbstractList 클래스가 소유하고 있으며 ITR을 직접 사용할 수 있습니다. 메소드 checkforcomodification ()은 집계 된 컨텐츠가 외부 세계에 의해 직접 수정되었는지 확인합니다 (반복자가 제공 한 remove () 메소드를 통해 수정되지 않음). 수집 된 컨텐츠가 반복 하위 객체에 의해 우회되고 반복 하위 객체 후 새해를 직접 수정하면이 방법은 즉시 예외를 던집니다.
또한 : AbstractList 클래스는 ListIterator () 메소드를 제공하여 ListIterator 인터페이스를 구현하는 클래스 ListITR 인스턴스를 반환합니다. Listiterator 인터페이스는 전방 반복 및 역 반복을 구현하고 반복 프로세스 중에 열의 내용을 안전하게 수정하는 방법을 제공합니다.
열거와 반복의 차이 : (1) 열거는 제거 방법이 없다 (2) 열거는 벡터의 요소 () 메소드에서 이름없는 클래스로 구현된다. 실패에 대한 비용은 빠르게 지불되지 않습니다. 즉, 반복 프로세스 중에 집계 된 객체는 외부 세계에 의해 예기치 않게 수정되며,이 반복 프로세스는 즉시 예외를 포착합니다.
위의 내용은이 기사에 관한 모든 것입니다. 모든 사람의 학습에 도움이되기를 바랍니다.