倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

「GoF デザインパターン」アノテーション (16) : Iterator パターン

今回は Iterator パターン一覧)。

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() {...}
}

増補改訂版Java言語で学ぶデザインパターン入門 オブジェクト指向における再利用のためのデザインパターン Code Complete第2版〈上〉―完全なプログラミングを目指して Code Complete第2版〈下〉―完全なプログラミングを目指して