迭代器模式(Iterator)是经常使用的设计模式,属于行为型模式,这种模式用于顺序访问集合对象的元素,不须要知道集合对象的底层表示java
若是咱们的集合元素是用不一样的方式实现的,有数组,还有java的集合类,或者还有其余方式,当客户端要遍历这些集合元素的时候就要使用多种遍历方式,并且还会暴露元素的内部结构,能够考虑使用迭代器模式解决设计模式
迭代器模式提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不须要知道集合对象的底层表示,即:不暴露其内部的结构数组
把在元素之间游走的责任交给迭代器,而不是聚合对象安全
因为迭代器模式将存储数据和遍历数据的职责分离,增长新的聚合类须要对应增长新的迭代器类,类的个数成对增长,这在必定程度上增长了系统的复杂性服务器
UML类图(原理)网络
UML类图(案例)dom
代码实现ide
迭代器类不做为持有迭代集合类的内部类大数据
@Data @AllArgsConstructor public class Department { // 迭代器内部元素 private String name; private String description; }
public class ComputerCollegeIterator implements Iterator { // 计算机学院迭代器,元素使用数组存储 通常会将迭代器实现类做为须要迭代对象的内部类 private Department[] departments; // 当前位置指针 private int index = 0; public ComputerCollegeIterator(Department[] departments) { this.departments = departments; } // 判断是否有下一个元素 @Override public boolean hasNext() { return !(this.index >= this.departments.length); } // 返回下一个元素 @Override public Department next() { return this.departments[this.index++]; } @Override public void remove() { // 移除方法空实现 } }
public class InfoCollegeIterator implements Iterator { // 信息工程学院迭代器,元素使用List集合存储 通常会将迭代器实现类做为须要迭代对象的内部类 private List<Department> departments; // 当前位置指针 private int index = 0; public InfoCollegeIterator(List<Department> departments) { this.departments = departments; } // 判断是否有下一个元素 @Override public boolean hasNext() { return !(this.index >= this.departments.size()); } // 返回下一个元素 @Override public Department next() { return this.departments.get(this.index++); } @Override public void remove() { // 移除方法空实现 } }
public interface College { // 学院接口 // 获取学院名称 String getName(); // 给学院内部添加系 void addDepartment(String name, String description); // 获取该学院所对应的迭代器 Iterator createIterator(); } // 实现类一 计算机学院 class ComputerCollege implements College { // 存储内部元素的集合,用于获取迭代器 private Department[] departments; // 当前元素位置指针 private int index; public ComputerCollege() { this.departments = new Department[5]; this.index = 0; addDepartment("Java专业", "Java专业 "); addDepartment("PHP专业", "PHP专业 "); addDepartment("大数据专业", "大数据专业"); } @Override public String getName() { return "计算机学院"; } @Override public void addDepartment(String name, String description) { Department department = new Department(name, description); this.departments[this.index++] = department; } @Override public Iterator createIterator() { return new ComputerCollegeIterator(this.departments); } } // 实现类二 信息工程学院 class InfoCollege implements College { // 存储内部元素的集合,用于获取迭代器 private List<Department> departments; public InfoCollege() { this.departments = new ArrayList<Department>(); addDepartment("信息安全专业", "信息安全专业"); addDepartment("网络安全专业", "网络安全专业"); addDepartment("服务器安全专业", "服务器安全专业"); } @Override public String getName() { return "信息工程学院"; } @Override public void addDepartment(String name, String description) { this.departments.add(new Department(name, description)); } @Override public Iterator createIterator() { return new InfoCollegeIterator(this.departments); } }
public class OutputImpl { // 输出迭代器元素内部的实现类 private List<College> colleges; public OutputImpl(List<College> colleges) { this.colleges = colleges; } public void printCollege() { // 获取List集合内部的迭代器 Iterator<College> iterator = colleges.iterator(); while (iterator.hasNext()) { College college = iterator.next(); System.out.println("======" + college.getName() + "======"); // 获取学院内部系的迭代器进行迭代输出 而不须要知道元素再内部以什么形式的集合存在,统一了遍历方式 printDepartment(college.createIterator()); } } private void printDepartment(Iterator iterator) { while (iterator.hasNext()) { Department department = (Department) iterator.next(); if (null != department) { System.out.println(department.getName() + "-----" + department.getDescription()); } } } }
public class Client { public static void main(String[] args) { // 建立学院的集合 List<College> colleges = new ArrayList<College>(); colleges.add(new ComputerCollege()); colleges.add(new InfoCollege()); // 建立输出类 并迭代输出学院及其下面的系 OutputImpl output = new OutputImpl(colleges); output.printCollege(); } }
迭代器类做为持有迭代集合类的内部类this
// 实现类一 计算机学院 public class ComputerCollege implements College { // 存储内部元素的集合,用于获取迭代器 private Department[] departments; // 当前元素位置指针 private int index; public ComputerCollege() { this.departments = new Department[5]; this.index = 0; addDepartment("Java专业", "Java专业 "); addDepartment("PHP专业", "PHP专业 "); addDepartment("大数据专业", "大数据专业"); } @Override public String getName() { return "计算机学院"; } @Override public void addDepartment(String name, String description) { Department department = new Department(name, description); this.departments[this.index++] = department; } @Override public Iterator createIterator() { return new ComputerCollegeIterator(); } // 迭代器类做为持有迭代集合类的内部类 private class ComputerCollegeIterator implements Iterator { // 计算机学院迭代器,元素使用数组存储 通常会将迭代器实现类做为须要迭代对象的内部类 // 当前位置指针 private int index = 0; // 判断是否有下一个元素 直接使用上层类的元素集合便可 @Override public boolean hasNext() { return !(this.index >= ComputerCollege.this.departments.length); } // 返回下一个元素 直接使用上层类的元素集合便可 @Override public Department next() { return ComputerCollege.this.departments[this.index++]; } @Override public void remove() { // 移除方法空实现 } } }
// 实现类二 信息工程学院 public class InfoCollege implements College { // 存储内部元素的集合,用于获取迭代器 private List<Department> departments; public InfoCollege() { this.departments = new ArrayList<Department>(); addDepartment("信息安全专业", "信息安全专业"); addDepartment("网络安全专业", "网络安全专业"); addDepartment("服务器安全专业", "服务器安全专业"); } @Override public String getName() { return "信息工程学院"; } @Override public void addDepartment(String name, String description) { this.departments.add(new Department(name, description)); } @Override public Iterator createIterator() { return new InfoCollegeIterator(); } // 迭代器类做为持有迭代集合类的内部类 private class InfoCollegeIterator implements Iterator { // 信息工程学院迭代器,元素使用List集合存储 通常会将迭代器实现类做为须要迭代对象的内部类 // 当前位置指针 private int index = 0; // 判断是否有下一个元素 直接使用上层类的元素集合便可 @Override public boolean hasNext() { return !(this.index >= InfoCollege.this.departments.size()); } // 返回下一个元素 直接使用上层类的元素集合便可 @Override public Department next() { return InfoCollege.this.departments.get(this.index++); } @Override public void remove() { // 移除方法空实现 } } }
在jdk的ArrayList源码中就使用到了迭代器模式
UML类图
说明
List就是充当了聚合接口,含有一个iterator()方法,返回一个迭代器对象
ArrayList是实现聚合接口List的子类,实现了iterator()
ArrayList内部的elementData属性就是存放元素的集合,是一个数组Object[]
Itr充当具体实现迭代器Iterator的类,做为ArrayList内部类
Iterator接口JDk提供
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { // 存储元素的集合 transient Object[] elementData; // 实现获取迭代器方法 public Iterator<E> iterator() { return new Itr(); } /** * An optimized version of AbstractList.Itr */ // 做为ArrayList内部类 实现迭代器Iterator private class Itr implements Iterator<E> { ...... } }