定义
大话设计模式定义:
迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
迭代器模式,常见的就是我们日常使用的 iterator 遍历。我们几乎每天都会使用 jdk 提供的 list 集合遍历。迭代器的特点是实现
Iterable 接口,通过 next 的方式获取集合元素,同时具备对元素的删除操作。而增强的 for 循环不行。
其中在访问数组、集合、列表等数据时,特别是数据库操作时,非常普遍。
类图
代码实战
使用 大学-院系-专业 列子来学习下:
一个大学有多个院系,一个院系有多个专业等等……
抽象聚合类-院系:College
抽象聚合类-院系:College 里面会添加部分内容,也会返回一个迭代器对象
//抽象聚合角色
public interface College {
String getName();//获取学院名称
//添加学院
void addDepartment(String name,String desc);
//返回一个迭代器对象
Iterator createIterator();
}
具体聚合类
ComputerCollege:实现 College 接口添加部分内容并提供具体迭代器的对象
//具体聚合类
public class ComputerCollege implements College{
Department[] departments;
/**
* 下面系的个数
*/
int departmentNum;
public ComputerCollege() {
departments = new Department[3];
addDepartment("计算机科学与技术","计算机科学与技术");
addDepartment("电子科学与技术","电子科学与技术");
addDepartment("信息与通信工程","信息与通信工程");
}
@Override
public String getName() {
return "计算机学院";
}
@Override
public void addDepartment(String name, String desc) {
Department department = new Department(name, desc);
departments[departmentNum] = department;
departmentNum++;
}
@Override
public Iterator createIterator() {
return new ComputerCollegeIterator(departments);
}
}
具体迭代器
这里我们在 Client 使用了 ArrayList 中的迭代器,也使用自己实现的迭代器:ComputerCollegeIterator
仿照 ArrayList 里面的迭代器:主要是 hasNext()、next() 两个方法。
// 具体迭代器
public class ComputerCollegeIterator implements Iterator {
/**
* 存放专业的容器
*/
Department[] departments;
/**
* 游标,用于记录遍历的位置
*/
int cursor;
public ComputerCollegeIterator(Department[] departments) {
this.departments = departments;
}
@Override
public boolean hasNext() {
return cursor < departments.length && departments[cursor] != null;
}
@Override
public Object next() {
Department department = departments[cursor];
cursor++;
return department;
}
}
测试
使用测试 client 类对代码进行测试:首先使用了 ArrayList 的迭代器对学院遍历,然后使用自定义的专业遍历器对专业进行遍历。
public class Client {
public static void main(String[] args) {
// 创建学院
List<College> colleges = new ArrayList<>();
colleges.add(new ComputerCollege());
Iterator<College> iterator = colleges.iterator();
while (iterator.hasNext()) {
// 取出一个学院
College college = iterator.next();
System.out.println("学院:" + college.getName());
iterator = college.createIterator();
while (iterator.hasNext()) {
Department department = (Department) iterator.next();
System.out.println("该学院下的专业有:" + department.getName());
}
}
}
}
总结
- 迭代器从功能实现上可以看到,满足了单一职责和开闭原则,外界调用方也不需要知道任何一个不同的数据结构在使用上的遍历差异。可以非常方便的扩展。
- 迭代器实现过程相对比较复杂,但是比如我们在使用 jdk 的时候,迭代器的模式还是很好用的,方便扩展和升级。