23 디자인 패턴, 14 장 : Java 반복자 패턴
정의 : 객체의 내부 세부 사항을 노출시키지 않고 컨테이너 객체의 다양한 요소에 액세스하는 방법을 제공합니다.
유형 : 행동 패턴
클래스 다이어그램 :
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 ()), 현재 객체의 제거 ()를 종료하는지 여부를 결정합니다.
반복자 구현 : 컬렉션의 반복을 완료하기 위해 반복자 인터페이스에 정의 된 메소드를 구현합니다.
코드 구현
인터페이스 반복자 {public Object Next (); 공개 부울 hasnext (); } class concreteiterator는 반복자 {private list list = new arraylist (); 개인 int cursor = 0; 공개 ConcreteIterator (목록 목록) {this.list = list; } public boolean hasnext () {if (cursor == list.size ()) {return false; } true를 반환합니다. } public Object Next () {Object obj = null; if (this.hasnext ()) {obj = this.list.get (cursor ++); } return obj; }} interface Aggregate {public void add (Object obj); 공개 void 제거 (Object obj); 공개 반복자 iterator (); } class concreteAggregate implements 집계 {private list list = new arrayList (); public void add (object obj) {list.add (obj); } public iterator iterator () {return new ConcreteIterator (list); } public void 제거 (Object obj) {list.remove (obj); }} public class client {public static void main (String [] args) {Aggregate ag = new ConcreteAggregate (); ag.add ( "Xiaoming"); ag.add ( "Xiaohong"); ag.add ( "Xiaogang"); 반복자 it = ag.iterator (); while (it.hasnext ()) {string str = (string) it.next (); System.out.println (str); }}} 위의 코드에서 집계는 컨테이너 클래스 인터페이스입니다. 수집, 목록, 세트 등을 상상할 수 있습니다. 집계는 단순화 된 버전입니다. 컨테이너 클래스 인터페이스에는 세 가지 주요 방법이 있습니다. 객체 메소드 추가 추가, 객체 메소드 제거 및 반복 메서드 반복자를 얻습니다. 반복자는 반복 객체 메소드를 얻고 메소드 hasNext를 반복할지 여부를 결정하는 반복자 인터페이스입니다. java.util.list와 java.util.iterator의 두 인터페이스를 비교하여 직접 생각할 수 있습니다.
반복자 모드의 장점 :
트래버스 방법이 단순화되었으며 객체 수집을 통과하는 것은 여전히 매우 번거 롭습니다. 배열 또는 주문 목록의 경우 커서를 통해 계속 얻을 수 있지만 사용자는 컬렉션에 대한 명확한 이해를 가지고 있다는 전제로 객체를 스스로 통과해야합니다. 그러나 해시 테이블의 경우 사용자를 가로 지르는 것이 더 번거 롭습니다. 반복자 방법을 도입 한 후 사용자가 사용하기가 훨씬 쉽습니다.
순서 대상 목록과 같은 여러 가지 방법이 있습니다. 필요에 따라 2 개의 반복자에게 양수 순서와 역 순서 트래버스를 제공 할 수 있습니다. 사용자는 컬렉션을 쉽게 통과하기 위해 구현 한 반복기 만 얻어야합니다.
캡슐화는 양호하며 사용자는 반복자가 트래버스를 가져 오기 만하면되지만 Traversal 알고리즘에 대해 걱정할 필요는 없습니다.
반복자 패턴의 단점 :
간단한 횡단 (예 : 배열 또는 주문 목록)의 경우 반복자를 사용하는 것이 더 성가신 일이며, Arraylist와 같이 루프에 사용하고 컬렉션을 통과하는 방법을 얻는다고 느낄 수 있습니다.
반복자 모드에 적용 가능한 시나리오
반복자 패턴은 컬렉션으로 공생적이고 죽음입니다. 일반적으로 컬렉션을 구현하는 한 컬렉션, 목록, 세트, 맵 등과 같이 컬렉션의 반복자를 동시에 제공해야합니다. 이러한 새 컨테이너를 구현하려면 물론 컨테이너의 반복기를 구현하기 위해 반복자 패턴을 도입해야합니다.
그러나 컨테이너와 반복자 간의 관계가 너무 가깝기 때문에 대부분의 언어는 컨테이너를 구현할 때 반복자를 제공하며 이러한 언어가 제공하는 컨테이너 및 반복자는 대부분의 경우 우리의 요구를 충족시킬 수 있습니다. 따라서 반복자 패턴을 스스로 연습하는 것은 비교적 드 rare니다. 기존 컨테이너와 반복자를 언어로만 사용하면됩니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.