{"pageProps":{"bread_crumbs":[{"name":"トピック一覧","href":"/topics","as":"/topics"},{"name":"デザインパターン","href":"/topics/[topic]","as":"/topics/[object Object]"}],"topic":{"id":"msh5cn_vc0z","createdAt":"2021-04-11T08:00:28.773Z","updatedAt":"2021-04-11T08:00:28.773Z","publishedAt":"2021-04-11T08:00:28.773Z","revisedAt":"2021-04-11T08:00:28.773Z","name":"デザインパターン","posts":[],"path_name":"design-pattern"},"posts":[{"id":"zz0lwz155","createdAt":"2021-04-11T14:36:55.164Z","updatedAt":"2021-04-11T14:37:53.069Z","publishedAt":"2021-04-11T14:36:55.164Z","revisedAt":"2021-04-11T14:37:53.069Z","title":"Iteratorパターン - デザインパターン","description":"こんにちは、よしでぶです。\n今回はデザインパターンの1つであるIteratorパターンについて調べたのでまとめます。\n数え上げに特化したデザインパターンであるIteratorパターンはプログラミングする上で良く出てくる場面が出てくる印象でした。","body":"

繰り返しの数え上げ処理にうってつけ!

突然ですが、プログラミングの三大要素をご存知でしょうか?

  1. 順次処理
  2. 条件分岐
  3. 反復処理

です。
Iteratorパターンはこの反復処理、つまり繰り返し処理にうってつけのデザインパターンになります。
以下は、配列 arr の要素を最初から最後まで出力するプログラム例です。

for (int i = 0; i < arr.length; i++) {\n  System.out.println(arr[i]);\n}

ここで注目するのは添字iです。iの数を増やしていくことで、配列の要素をスキャン(走査)していることがわかります。
こういう配列の要素を順番に参照する場面はプログラミングする上で多く出現します。
ここで使われている添字iの働きを抽象化したものがIteratorパターンです。

クラス図

Iteratorパターンのクラス図は以下のようになります。

Aggregateは 集合体 と言う意味で、数え上げたい・スキャンしたいモノに対してiteratorメソッドを使って数え上げをおこないます。
Iteratorインターフェースは、先程の添字iの役割を果たします。Iteratorの役割は主に2つで

  1. 集合体における次の要素を返す
  2. 集合体において次に数え上げるものが存在するかどうか判断する

です。

実装例

クラスメイトの友達 (friends)の名前をスキャンして出力するプログラムを紹介します。 先程の添字iを使っていないところに注目してください。
?> 実装例なので動作保証は致しませんのでご了承ください。

public interface Aggregate {\n  public abstract Iterator iterator();\n}\n\npublic interface Iterator {\n  public abstract boolean hasNext();\n  public abstract Object next();\n}\n\npublic class Classmate implements Aggregate {\n  private String[] friends;\n  private int last = 0;\n  public Classmate(int maxSize) {\n    this.friends = new String[maxSize];\n  }\n  public Toy getFriendAt(int index) {\n    return friends[index];\n  }\n  public void appendFriend(String friends) {\n    this.friends[last] = friend;\n    last++;\n  }\n  public int getLength() {\n    return last;\n  }\n  public Iterator iterator() {\n    return new ClassmateIterator(this);\n  }\n}\n\npublic class ClassmateIterator implements Iterator {\n  private Classmate classmate;\n  private int index;\n  public ClassmateIterator(Classmate classmate) {\n    this.classmate = classmate;\n    this.index = 0;\n  }\n  public boolean hasNext() {\n    return index < classmate.getLength();\n  }\n  public Object next() {\n    String friend = classmate.getFriendAt(index);\n    index++;\n    return friend;\n  }\n}

これを使って先程の添字iを使った数え上げを修正してみます。

Classmate classmate = new Classmate(3);\nclassmate.appendFriend("Tom");\nclassmate.appendFriend("Alice");\nclassmate.appendFriend("Bob");\nIterator it = classmate.iterator();\nwhile (it.hasNext()) {\n   String friend = (String) it.next();\n   System.out.println(friend);\n}

数え上げの役割だった添字iが無くなって、代わりに変数 it がそれを担っています。
ちなみに、JavaのListインターフェースにはiteratorパターンが実装されているのでここまで自前で作らなくても簡単にIteratorパターンを使うことができます。
参考: https://docs.oracle.com/javase/jp/7/api/java/util/List.html#iterator()

ポイント

終わりに

今回はIteratorパターンについて調べてみました。使える場面が多そうなパターンだなと思いました!ではでは。

","thumbnail":{"url":"https://images.microcms-assets.io/assets/7fa9f8975e7845759f5c8de646af32af/e73db4e3840b4f1eb235bd3a8f5360ef/iterator_design_pattern.png","height":630,"width":1200},"topics":[{"id":"msh5cn_vc0z","createdAt":"2021-04-11T08:00:28.773Z","updatedAt":"2021-04-11T08:00:28.773Z","publishedAt":"2021-04-11T08:00:28.773Z","revisedAt":"2021-04-11T08:00:28.773Z","name":"デザインパターン","posts":[],"path_name":"design-pattern"}],"category":{"id":"6tg5du2jx","createdAt":"2021-04-11T07:55:46.137Z","updatedAt":"2021-04-11T07:55:57.125Z","publishedAt":"2021-04-11T07:55:57.125Z","revisedAt":"2021-04-11T07:55:57.125Z","name":"Web開発","path_name":"web-develop","logo":{"url":"https://images.microcms-assets.io/assets/7fa9f8975e7845759f5c8de646af32af/90ef5ba6a28045f8a80261a594973d43/web_develop.svg","height":85,"width":111},"description":"プログラミングや開発設計、フロントエンドやバックエンド、データベースやネットワークのインフラ等、分野問わず私が経験したWeb開発の話を発信していきます。","posts":[]}}],"service_url":"https://yotteq.net"},"__N_SSG":true}