1. Iteratorパターン 1
- 2012/04/26 一部修正しました
- 1.1 Itaratorパターンとは
- 1.2 サンプルケース
- 1.2 実習課題1
- 1.2 実習課題2
- 1.2 実習課題3
- 1.3 Iterator パターンのまとめ
1.1 Itaratorパターンとは
まずは、デザインパターンに慣れるために比較的理解しやすいIteratorパターンを学びます。 iterateという英単語は「繰り返す」という意味であり、iteratorは日本語にすると「反復子」などと呼ばれるものです。 Iterator パターンは、要素の集まりを保有するオブジェクトの各要素に順番にアクセスする方法を提供するためのパターンです。
たとえば、集約オブジェクトとして List クラスを想定してみましょう。 List クラスは、要素としていくつかのオブジェクトを持つことができるものとします。 このList オブジェクトが持つ要素に順番にアクセスするような場合、 どのような順番で各要素にアクセスするのかによって、さまざまな走査方法が考えられます。 例えば、各オブジェクトが持つ名前の順番にアクセスしたい場合が考えられますし、 各オブジェクトの何らかのパラメータを利用して走査したい場合もあるでしょう。 それでは、これらの「走査方法」は誰が提供すればよいでしょう? List クラスですべての走査方法を提供することは不可能です。 なぜなら、走査方法は、その目的によって、さまざまなものが考えられ、 そのすべてをあらかじめ用意しておくことができないからです。 そこで、この走査方法を与えるクラスを List クラスとは独立させておきます。 すると、必要な走査方法を与えるクラスをユーザが自分で作成し、 これを利用できるようになり、より柔軟な設計となるわけです。
また、集約オブジェクトとして利用するクラスを変更する必要が生じた際などに、 その変更が多くの部分に影響を与えるようなことが考えられます。 Iterator パターンでは、集約オブジェクトを生成するクラスが走査のための共通のインタフェースを与えるようにすることで、 変更すべき点を少なく抑える設計になっています。
それでは、サンプルケースを見てみましょう。
1.2 サンプルケース
サンプルケースでは、あなたが学校の先生であることを考えてみましょう。 あなたは、ある学校の新任の先生で、あるクラスの担任を任せられました。 あなたが担任している「生徒」は5人いるものとします。 「生徒」を表すクラス Student クラスは、以下のように定義しましょう。
public class Student{ private String name; private int sex; //男の子:1 女の子:2 public Student(String name,int sex){ this.name = name; this.sex = sex; } public String getName(){ return name; } public int getSex(){ return sex; } }
生徒は名前、性別を表すメンバ変数 name 、sexを持ち、名前を返す getName() メソッドと、性別を返す getSex() メソッドを持ちます。 これらの生徒を管理するために学校から先生に名簿が支給されます。学校から与えられる名簿は以下のように記述されています。
public class StudentList{ protected Student[] students; private int last = 0; public StudentList(){} public StudentList(int studentCount){ this.students = new Student[studentCount]; } public void add(Student student){ students[last] = student; last++; } public Student getStudentAt(int index){ return students[index]; } public int getLastNum(){ return last; } }
あなたは、学校から支給されたこの「StudentList」クラスを自由に拡張して利用することができるものとします。
また、この学校では、先生に対して「先生かくあるべき」という文書として、先生に求める能力を定義しています。
この第1条に以下のような条文があります。
第1条 先生は、学校から与えられた名簿に自分の生徒を書き込むことができること
第2条 先生は、生徒の名前を名簿の記載順に呼ぶことができること
この条文は、Java では以下のように表現されるでしょう。
public abstract class Teacher{ protected StudentList studentList; public abstract void createStudentList(); public abstract void callStudents(); }
あなたは、まだ新任で、この能力を持っていません。そこで、あなたはこの能力を身に付ける必要があります。 さてあなたは、どのような設計を行い、「Teacher」クラスで宣言されている抽象メソッドをどのように実装するでしょう?