Java设计模式之迭代器模式
迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。
抽象迭代器(Iterator):定义了遍历聚合对象所需的方法,包括hashNext()和next()方法等,用于遍历聚合对象中的元素。
具体迭代器(Concrete Iterator):它是实现迭代器接口的具体实现类,负责具体的遍历逻辑。它保存了当前遍历的位置信息,并可以根据需要向前或向后遍历集合元素。
抽象聚合器(Aggregate): 一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
具体聚合器(ConcreteAggregate):就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。
优点:
简化了集合类的接口,使用者可以更加简单地遍历集合对象,而不需要了解集合内部结构和实现细节。
将集合和遍历操作解耦,使得我们可以更灵活地使用不同的迭代器来遍历同一个集合,根据需求选择不同的遍历方式。
满足开闭原则,如果需要增加新的遍历方式,只需实现一个新的具体迭代器即可,不需要修改原先聚合对象的代码。
缺点:
具体迭代器实现的算法对外不可见,因此不利于调试和维护。
对于某些小型、简单的集合对象来说,使用迭代器模式可能会显得过于复杂,增加了代码的复杂性。
实验18:迭代器模式
[实验任务一]:JAVA和C++常见数据结构迭代器的使用
信1305班共44名同学,每名同学都有姓名,学号和年龄等属性,分别使用JAVA内置迭代器和C++中标准模板库(STL)实现对同学信息的遍历,要求按照学号从小到大和从大到小两种次序输出学生信息。
import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; class Student implements Comparable<Student>{ private String name; private int sid; private int age; public Student(String name, int sid, int age) { this.name = name; this.sid = sid; this.age = age; } @Override public String toString() { return "Student{" + "姓名='" + name + '\'' + ", 学号=" + sid + ", 年龄=" + age + '}'; } @Override public int compareTo(Student o) { if (this.sid > o.sid){ return -1; } else if (this.sid < o.sid){ return 1; } else { return 0; } } } class IteratorDemo { public static void main(String[] args) { Student student1 = new Student("张三",20193885,21); Student student2 = new Student("李四",20201456,20); Student student3 = new Student("王五",20184655,23); Student student4 = new Student("赵六",20191242,22); Student student5 = new Student("李七",20213256,19); List<Student> list = new ArrayList<Student>(); list.add(student1);list.add(student2);list.add(student3); list.add(student4);list.add(student5); Collections.sort(list); System.out.println("按学号排序输出:"); Iterator i = list.iterator(); while (i.hasNext()){ System.out.println(i.next().toString()); } } }