####### 对客户端隐藏了遍历细节,遍历方式的改变对客户端来说是透明的,避免了遍历方式改变对客户端的影响,以满足单一职责原则。
UML类图
代码实例
package com.depthmind.designpattern;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorPattern {
public static void main(String[] args) {
College computerCollege = new ComputerCollege();
College informationCollege = new InformationCollege();
Iterator computerCollegeIterator = computerCollege.createIterator();
Iterator informationCollegeIterator = informationCollege.createIterator();
System.out.println(computerCollege.getName());
while (computerCollegeIterator.hasNext()) {
System.out.println(((Department) computerCollegeIterator.next()).getName());
}
System.out.println("-----------------");
System.out.println(informationCollege.getName());
while (informationCollegeIterator.hasNext()) {
System.out.println(((Department) informationCollegeIterator.next()).getName());
}
}
}
class ComputerCollegeIterator implements Iterator {
private List<Department> departmentList;
private volatile int index = -1;
public ComputerCollegeIterator(List<Department> departmentList) {
this.departmentList = departmentList;
}
@Override
public boolean hasNext() {
if (index >= departmentList.size() - 1) {
return false;
}
return true;
}
@Override
public Object next() {
index ++;
return departmentList.get(index);
}
}
class InformationCollegeIterator implements Iterator{
private Department[] departments;
private volatile int index = -1;
public InformationCollegeIterator(Department[] departments) {
this.departments = departments;
}
@Override
public boolean hasNext() {
if (index + 1 >= departments.length || departments[index + 1] ==null) {
return false;
}
return true;
}
@Override
public Object next() {
index ++;
return departments[index];
}
}
interface College {
String getName();
void addDepartment(Department department);
Iterator createIterator();
}
class ComputerCollege implements College {
private List<Department> departments;
public ComputerCollege() {
this.departments = new ArrayList<>(5);
addDepartment(new Department("Java", "Java"));
addDepartment(new Department("PHP", "PHP"));
addDepartment(new Department("Python", "Python"));
}
@Override
public String getName() {
return "计算机学院";
}
@Override
public void addDepartment(Department department) {
departments.add(department);
}
@Override
public Iterator createIterator() {
return new ComputerCollegeIterator(departments);
}
}
class InformationCollege implements College {
private Department[] departments;
private volatile int index = 0;
public InformationCollege() {
departments = new Department[5];
addDepartment(new Department("信息安全","信息安全"));
addDepartment(new Department("网络安全","网络安全"));
addDepartment(new Department("服务器安全","服务器安全"));
}
@Override
public String getName() {
return "信息学院";
}
@Override
public void addDepartment(Department department) {
departments[index] = department;
index++;
}
@Override
public Iterator createIterator() {
return new InformationCollegeIterator(departments);
}
}
class Department {
private String name;
private String description;
public Department(String name, String description) {
this.name = name;
this.description = description;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
}