{"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":"
突然ですが、プログラミングの三大要素をご存知でしょうか?
です。
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つで
です。
クラスメイトの友達 (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}