一,迭代器模式
迭代器模式: 提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层是如何表示的,即:不暴露其内部的结构;
二,原理类图
意图: 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
适用性:
一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。访问一个聚合对象的内容而无需暴露它的内部表示。支持对聚合对象的多种遍历。为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。
三,实例
Iterator: 迭代器接口,jdk提供;
package java.util;
import java.util.function.Consumer;
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
ConcreteIterator: 具体的迭代器,管理迭代;
package com.neei.iterator;
import java.util.Iterator;
/**
* @param
* @Author: AaNeei
* @Date: 2019/10/14 21:21
* @Description: 游学网
* @throws:
*/
public class ComputerCollegeIterator implements Iterator {
//存放方式,计算机学院以数组方式存放
Department[] departments;
int position = 0;
public ComputerCollegeIterator(Department[] departments) {
this.departments = departments;
}
@Override
public boolean hasNext() {
if (position >= departments.length || departments[position] == null) {
return false;
}
return true;
}
@Override
public Object next() {
return departments[position++];
}
@Override
public void remove() {
}
}
public class InfoCollegeIterator implements Iterator {
//信息学院以集合方式存放
List<Department> departments;
int index = -1;
public InfoCollegeIterator(List<Department> departments) {
this.departments = departments;
}
@Override
public boolean hasNext() {
if (index >= departments.size() - 1) {
return false;
}
return true;
}
@Override
public Object next() {
return departments.get(++index);
}
@Override
public void remove() {
}
}
Aggregate: 一个统一的聚合接口,将客户端与具体聚合解耦;
package com.neei.iterator;
import java.util.Iterator;
/**
* @param
* @Author: AaNeei
* @Date: 2019/10/14 21:29
* @Description: 游学网
* @throws:
*/
public interface College {
String getName();
void addDepartment(String name, String desc);
Iterator createIterator();
}
ConcreteAggregate: 具体的聚合持有的集合对象,提供方法返回适合的迭代器;
package com.neei.iterator;
import java.util.Iterator;
/**
* @param
* @Author: AaNeei
* @Date: 2019/10/14 21:31
* @Description: 游学网
* @throws:
*/
public class ComputerCollege implements College {
Department[] departments;
private int num = 0;
public ComputerCollege() {
this.departments = new Department[5];
addDepartment("java", "java");
addDepartment("BigData", "BigData");
addDepartment("python", "python");
addDepartment("C", "C");
addDepartment("C#", "C#");
}
@Override
public String getName() {
return "计算机学院";
}
@Override
public void addDepartment(String name, String desc) {
departments[num++] = new Department(name, desc);
}
@Override
public Iterator createIterator() {
return new ComputerCollegeIterator(departments);
}
}
public class InfoCollege implements College {
private List<Department> departments ;
public InfoCollege() {
this.departments = new ArrayList<>(5);
addDepartment("通信工程","通信工程");
addDepartment("信息安全","信息安全");
}
@Override
public String getName() {
return "信息工程学院";
}
@Override
public void addDepartment(String name, String desc) {
departments.add(new Department(name, desc));
}
@Override
public Iterator createIterator() {
return new InfoCollegeIterator(departments);
}
}
client:
package com.neei.iterator;
import java.util.Iterator;
import java.util.List;
/**
* @param
* @Author: AaNeei
* @Date: 2019/10/14 21:40
* @Description: 游学网
* @throws:
*/
public class OutPut {
List<College> colleges;
public OutPut(List<College> colleges) {
this.colleges = colleges;
}
public void printCollege() {
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();
System.out.println(department.getName() + ":" + department.getDesc());
}
}
}
public class Client {
public static void main(String[] args) {
List<College> colleges = new ArrayList<>(5);
colleges.add(new ComputerCollege());
colleges.add(new InfoCollege());
OutPut outPut = new OutPut(colleges);
outPut.printCollege();
}
}
四,源码分析
JDK源码中使用的迭代器模式,如java.util.List#iterator;