Iterator パターンの登場人物
- @Aggregate → 型
- iteratorType : Class<?>
- @CreateIterator → メソッド
- @ConcreteAggregate → 具象クラス
- aggregateType : Class<?>
- @Iterator → 型
- iteratedType : Class<?>
- @HasNext → メソッド
- @Next → メソッド
- @ConcreteIterator → 具象クラス
- iteratorType : Class<?>
- @AggregateInstance → フィールド
アノテーション定義
上記の定義の具体的な Java コード。
package org.waman.tools.design.gof.behavioral; import java.lang.annotation.*; public final class IteratorPattern { private IteratorPattern(){} @Target(ElementType.TYPE) public static @interface Aggregate{ Class<?> iteratorType() default Void.class; @Inherited @Target(ElementType.METHOD) public static @interface CreateIterator{} } @Target(ElementType.TYPE) public static @interface ConcreteAggregate { Class<?> aggregateType() default Void.class; } @Target(ElementType.TYPE) public static @interface Iterator { Class<?> iteratedType() default Void.class; @Inherited @Target(ElementType.METHOD) public static @interface HasNext {} @Inherited @Target(ElementType.METHOD) public static @interface Next {} } @Target(ElementType.TYPE) public static @interface ConcreteIterator { Class<?> iteratorType() default Void.class; @Inherited @Target(ElementType.FIELD) public static @interface AggregateInstance{} } }
サンプルコード in 『Java 言語で学ぶデザインパターン入門』
Book.java
列挙される対象のクラス。 Iterator パターンでの役割はありません。
public class Book {...}
Aggregate.java
@Aggregate 役のインターフェース。
import org.waman.tools.design.gof.behavioral.IteratorPattern; import org.waman.tools.design.gof.behavioral.IteratorPattern.Aggregate.CreateIterator; @IteratorPattern.Aggregate(iteratorType = Iterator.class) public interface Aggregate{ @CreateIterator Iterator iterator(); }
BookShelf.java
@ConcreteAggregate 役の具象クラス。
import org.waman.tools.design.gof.behavioral.IteratorPattern; @IteratorPattern.ConcreteAggregate(aggregateType = Aggregate.class) public class BookShelf implements Aggregate{ ... @Override public Iterator iterator() { return new BookShelfIterator(this); } }
Iterator.java
@Iterator 役のインターフェース。 java.util.Iterator とは全く関係ありません。
import org.waman.tools.design.gof.behavioral.IteratorPattern; import org.waman.tools.design.gof.behavioral.IteratorPattern.Iterator.HasNext; import org.waman.tools.design.gof.behavioral.IteratorPattern.Iterator.Next; @IteratorPattern.Iterator(iteratedType = Book.class) public interface Iterator { @HasNext boolean hasNext(); @Next Book next(); }
BookShelfIterator.java
@ConcreteIterator 役の具象クラス。
import org.waman.tools.design.gof.behavioral.IteratorPattern; import org.waman.tools.design.gof.behavioral.IteratorPattern.ConcreteIterator.AggregateInstance; @IteratorPattern.ConcreteIterator(iteratorType = Iterator.class) public class BookShelfIterator implements Iterator { @AggregateInstance private BookShelf bookShelf; ... @Override public boolean hasNext() {...} @Override public Book next() {...} }