『Java言語で学ぶデザインパターン入門』をPHPで実習する 第1章Iteratorパターン

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

一回デザインパターンについてちゃんと本を読んでおこうかなーと思ったので。本書のサンプルコードはJavaですが、私はJavaはある程度読めるけど、書く方はからきしなので、サンプルコードはPHPで書きます。本書の練習問題にはJavaの言語仕様に依存するものも多いですが、デザインパターン自体はオブジェクト指向言語に共通して使える概念なので、PHPでもほとんど問題ありません。

なお、本記事に掲載したサンプルコードは https://github.com/ryo-utsunomiya/design_pattern からダウンロードできます。

Iteratorパターンとは

繰り返しを表現するためのパターンです。機能的にはループ(for, while等)と変わりませんが、統一的なインターフェースを提供している点が大きな違いです。ループでは、オブジェクトを使う側がオブジェクトの状態を知っている必要があるのに対し、Iteratorでは、決まったAPIを呼び出しさえすれば、期待する結果が得られます。

サンプルコードは、「本」を収める「本棚」と、「本棚」を走査するための「本棚Iterator」を実装しています。

まずはIteratorのインタフェースを作成します。これを実装したクラスであれば、どんなクラスであれ同じ操作を行えます。

次に、オブジェクトの集合であり、Iteratorを返す役割を持つインタフェースを定義します。

インタフェースが定義できたので、具体的なオブジェクトを実装していきます。まずは、「本」。

次に、「本」の集合である「本棚」。「本棚」は、Aggregateインタフェースを実装します。

最後に、本棚を走査する本棚Iterator。

これで、クラス定義はできました。以下のようなコードで実行ができます。

では、実行してみます。まず、以下のような形でファイルを配置します。

autoload.phpは以下の内容です。PSR-0のオートローダーです。

iterator.phpは以下。

これを実行すると、本の名前が4回表示されます。

PHPにおけるIterator

ここでは、Iteratorパターンを理解するため、独自のIteratorインタフェースを実装しました。しかし、PHPには組み込みのIteratorやIteratorのインタフェースが用意されています。PHPの場合、独自にインタフェースやIteratorを実装する必要はそれほどないと思います。

以下は、IteratorAggregateを使った例です。$booksは配列なので、PHP組み込みのArrayIteratorを使っています。

ArrayIteratorを使わず、自前でIteratorを実装するなら以下のようになるでしょう。

コメントを残す