デザインパターン イテレータパターンの注意事項
説明する
学習デザインパターン~イテレータパターンの書き方を記録します。使用される JDK バージョンはバージョン 1.8 です。
イテレーター
目的: オブジェクトの内部表現を公開せずに、集合オブジェクト内の個々の要素に順次アクセスする方法を提供します。
構造:
ここで:
- イテレータ (セレクタ) は、要素にアクセスし、要素を横断するためのインターフェイスを定義します。
- Concretelterator (具象反復子) はセレクター インターフェイスを実装し、集合体を走査するときに現在の位置を追跡します。
- Aggregate は、対応するセレクター オブジェクトを作成するためのインターフェイスを定義します。
- ConcreteAggregate (具体的な集約) は、対応するセレクターを作成するインターフェイスを実装します。この操作は、Concretelterator の適切なインスタンスを返します。
適用性:
- 内部表現を公開せずに集約オブジェクトの内容にアクセスします。
- 集約オブジェクトの複数の走査をサポートします。
- さまざまな集合構造を横断するための統合インターフェイスを提供します。
目次
イテレータパターンのクラス図の例
この UML クラス図を使用して Iterator パターンの例を実装します。
学生部門
package com.example.deesign_patterns.iterator;
//学生类
public class Student {
private String name;
private String number;
public Student(String name, String number) {
this.name = name;
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", number='" + number + '\'' +
'}';
}
}
抽象反復子の役割インターフェイス
package com.example.deesign_patterns.iterator;
//抽象迭代器角色接口
public interface StudentIterator {
//判断是否还有元素
boolean hasNext();
//获取下一个元素
Student next();
}
具体的なイテレータのロールクラス
package com.example.deesign_patterns.iterator;
import java.util.List;
//具体迭代器角色类
public class StudentIteratorImpl implements StudentIterator{
private List<Student> list;
private int position=0;//用来记录遍历时的位置
public StudentIteratorImpl(List<Student> list) {
this.list = list;
}
@Override
public boolean hasNext() {
return position< list.size();
}
@Override
public Student next() {
//从集合中获取指定位置的元素
Student currentStudent = list.get(position);
position++;
return currentStudent;
}
}
抽象的な集合ロールインターフェイス
package com.example.deesign_patterns.iterator;
//抽象聚合角色接口
public interface StudentAggregate {
//添加学生功能
void addStudent(Student stu);
//删除学生功能
void removeStudent(Student stu);
//获取迭代器对象功能
StudentIterator getStudentIterator();
}
具体的な集合ロールクラス
package com.example.deesign_patterns.iterator;
import java.util.ArrayList;
import java.util.List;
//具体聚合角色类
public class StudentAggregateImpl implements StudentAggregate{
private List<Student> list=new ArrayList<Student>();
@Override
public void addStudent(Student stu) {
list.add(stu);
}
@Override
public void removeStudent(Student stu) {
list.remove(stu);
}
//获取迭代器对象
@Override
public StudentIterator getStudentIterator() {
return new StudentIteratorImpl(list);
}
}
テストクラス
package com.example.deesign_patterns.iterator;
//测试类
public class Client {
public static void main(String[] args) {
//创建聚合对象
StudentAggregateImpl aggregate=new StudentAggregateImpl();
//添加元素
aggregate.addStudent(new Student("张三","001"));
aggregate.addStudent(new Student("李四","002"));
aggregate.addStudent(new Student("王五","003"));
aggregate.addStudent(new Student("赵六","004"));
//遍历聚合对象
//获取迭代器对象
StudentIterator iterator=aggregate.getStudentIterator();
//遍历
while (iterator.hasNext()){
//获取元素
Student student=iterator.next();
System.out.println(student.toString());
}
}
}
利点:
- さまざまな方法で集約オブジェクトを走査することがサポートされており、同じ集約オブジェクトに対して複数の走査メソッドを定義できます。イテレータ モードでは、元のイテレータを別のイテレータに置き換えてトラバーサル アルゴリズムを変更するだけでよく、新しいトラバーサル メソッドをサポートするためにイテレータのサブクラスを独自に定義することもできます。
- セレクターは集約クラスを簡素化します。イテレータの導入により、元の集約オブジェクトにデータ トラバーサルやその他のメソッドを提供する必要がなくなり、集約クラスの設計を簡素化できます。
- イテレータ パターンでは、抽象化層の導入により、元のコードを変更することなく新しい集約クラスとイテレータ クラスを追加することが非常に便利になり、「開始と終了の原則」の要件を満たします。
欠点:
- クラスの数が増えると、システムの複雑さがある程度増加します。