倭マン's BLOG

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

アノテーションでデザインパターンの役割をマークする (5):『Java 言語で学ぶデザインパターン入門』(結城浩)を参考にしてみる

以前に『アノテーションデザインパターンの役割をマークする』ってな記事を書きました。 そこでは、定型のデザインパターンで役割を担っているクラスなどにアノテーションでマーク付けをしようという試みでした。

ところで、デザインパターンと言えばやはり GoF 本に載ってるパターンですが、『増補改訂版Java言語で学ぶデザインパターン入門』を見ると、「登場人物」や「○○の役」と称してこれらのパターンについて整理されているではありませんか!

ということで、そこに載っている「役割」や「サンプルコード」を参照にしつつ、GoF 本のデザインパターンについて「アノテーションデザインパターンの役割をマークする」具体的なサンプルを作ってみます。 今回は Iterator パターン

Iterator パターンの登場人物


Iterator パターンで登場する型を列挙すると、以下のようになります。

  • interface Aggregate
    • createIterator()
  • class ConcreteAggregate (implements Aggregate)
    • createIterator()
  • interface Iterator
    • hasNext()
    • next()
  • class ConcreteIterator (implements Iterator)
    • hasNext()
    • next()

Aggregate, ConcreteAggregate に定義されているメソッドは、『Java 言語で学ぶデザインパターン入門』では iterator() となっていますが、ここでは createIterator() にしています。

アノテーションを定義する Java コード


上記の登場人物をアノテーションにすると以下のようになります。 ただし、ここでは「クラスベースの実現」を用いています。

package org.waman.tools.design.gof.IteratorPattern;

import java.lang.annotation.*;

public final class IteratorPattern {
    
    private IteratorPattern(){}
        
    /** 集約子 */
    @Target(ElementType.TYPE)
    public static @interface Aggregate{
        
        /** 反復子を生成するメソッド */
        @Target(ElementType.METHOD)
        public static @interface CreateIterator{}
    }

    /** 具象集約子 */
    @Target(ElementType.TYPE)
    public static @interface ConcreteAggregate {
        
        /** 反復子を生成するメソッド */
        @Target(ElementType.METHOD)
        public static @interface CreateIterator{}
    }

    /** 反復子 */
    @Target(ElementType.TYPE)
    public static @interface Iterator {

        /** 次の要素があるかどうかの問い合わせを行うメソッド */
        @Target(ElementType.METHOD)
        public static @interface HasNext {}

        /** 次の要素を取得するメソッド */
        @Target(ElementType.METHOD)
        public static @interface Next {}
    }

    /** 具象反復子 */
    @Target(ElementType.TYPE)
    public static @interface ConcreteIterator {

        /** 次の要素があるかどうかの問い合わせを行うメソッド */
        @Target(ElementType.METHOD)
        public static @interface HasNext {}

        /** 次の要素を取得するメソッド */
        @Target(ElementType.METHOD)
        public static @interface Next {}
    }
}

サンプルコード in 『Java 言語で学ぶデザインパターン入門』


Java 言語で学ぶデザインパターン入門』の Iterator の章に載っているサンプルに対して、上記のアノテーションを付加してみましょう。 サンプルは Generic に変更していますがあしからず。

Book クラス

これは列挙される型です。 デザインパターンでの役割はありません。

public class Book {...}

Aggregate インターフェース

Iterator を生成するクラス。

import org.waman.tools.design.gof.IteratorPattern;
import org.waman.tools.design.gof.IteratorPattern.Aggregate.CreateIterator;

@IteratorPattern.Aggregate
public interface Aggregate<E> {
    @CreateIterator Iterator<E> iterator();
}

BookShelf クラス

Aggregate の具象クラス。

import org.waman.tools.design.gof.IteratorPattern;
import org.waman.tools.design.gof.IteratorPattern.ConcreteAggregate.CreateIterator;

@IteratorPattern.ConcreteAggregate
public class BookShelf implements Aggregate<Book>{
    ...
    @CreateIterator public Iterator<Book> iterator() {...}
}

Iterator インターフェース

Java では Iterator の役割をする型は java.util.Iterator インターフェースを実装しているのが普通でしょうが、簡単のためここではそうしていません。

import org.waman.tools.design.gof.IteratorPattern;
import org.waman.tools.design.gof.IteratorPattern.Iterator.HasNext;
import org.waman.tools.design.gof.IteratorPattern.Iterator.Next;

@IteratorPattern.Iterator
public interface Iterator<E> {
    @HasNext boolean hasNext();
    @Next E next();
}

BookShelfIterator クラス

Iterator の具象クラスです。

import org.waman.tools.design.gof.IteratorPattern;
import org.waman.tools.design.gof.IteratorPattern.ConcreteIterator.HasNext;
import org.waman.tools.design.gof.IteratorPattern.ConcreteIterator.Next;

@IteratorPattern.ConcreteIterator
public class BookShelfIterator implements Iterator<Book> {
    ...
    @HasNext public boolean hasNext() {...}
    @Next public Book next() {...}
}

大体、こんな感じ。 これを元に、次回以降チョットあれこれ修正。

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門


オブジェクト指向における再利用のためのデザインパターン

オブジェクト指向における再利用のためのデザインパターン

  • 作者: エリックガンマ,ラルフジョンソン,リチャードヘルム,ジョンブリシディース,Erich Gamma,Ralph Johnson,Richard Helm,John Vlissides,本位田真一,吉田和樹
  • 出版社/メーカー: ソフトバンククリエイティブ
  • 発売日: 1999/10
  • メディア: 単行本
  • 購入: 21人 クリック: 711回
  • この商品を含むブログ (201件) を見る