以前に『アノテーションでデザインパターンの役割をマークする』ってな記事を書きました。 そこでは、定型のデザインパターンで役割を担っているクラスなどにアノテーションでマーク付けをしようという試みでした。
ところで、デザインパターンと言えばやはり 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() {...} }
大体、こんな感じ。 これを元に、次回以降チョットあれこれ修正。

- 作者: 結城浩
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2004/06/19
- メディア: 大型本
- 購入: 51人 クリック: 762回
- この商品を含むブログ (395件) を見る

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