定义
迭代器模式(IteratorPattern)是常用的设计模式,属于行为型模式,如果我们的集合元素是用不同的方式实现的,有数组,还有java的集合类,或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决。迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构。
迭代器模式的注意事项和细节
优点
提供一个统一的方法遍历对象,客户不用再考虑聚合的类型,使用一种方法就可以遍历对象了。
隐藏了聚合的内部结构,客户端要遍历聚合的时候只能取到迭代器,而不会知道聚合的具体组成。
提供了一种设计思想,就是一个类应该只有一个引起变化的原因(叫做单一责任原则)。在聚合类中,我们把迭代器分开,就是要把管理对象集合和遍历对象集合的责任分开,这样一来集合改变的话,只影响到聚合对象。而如果遍历方式改变的话,只影响到了迭代器。
当要展示一组相似对象,或者遍历一组相同对象时使用, 适合使用迭代器模式
缺点
每个聚合对象都要一个迭代器,会生成多个迭代器不好管理类
实现
import java.util.ArrayList;
import java.util.List;
/**
* 迭代器模式
*/
public class Iterator {
public static void main(String[] args) {
List<Colleages> colleages = new ArrayList<>();
ComputerColleage computerColleage = new ComputerColleage();
computerColleage.addDepart(new Depart("java专业"));
computerColleage.addDepart(new Depart("PHP专业"));
computerColleage.addDepart(new Depart("Pyphon专业"));
colleages.add(computerColleage);
OutputIml outputIml = new OutputIml(colleages);
outputIml.print();
}
}
class ComputerColleageIterator implements java.util.Iterator {
List<Depart> computerColleageList;
int position;
public ComputerColleageIterator(List<Depart> computerColleageList) {
this.computerColleageList = computerColleageList;
}
@Override
public boolean hasNext() {
if (position >= computerColleageList.size()) {
return false;
} else {
position += 1;
return true;
}
}
@Override
public Object next() {
return computerColleageList.get(position - 1);
}
@Override
public void remove() {
}
}
interface Colleages {
void addDepart(Depart department);
java.util.Iterator createIterator();
String getName();
}
class ComputerColleage implements Colleages {
List<Depart> computerColleageList;
public ComputerColleage() {
computerColleageList = new ArrayList<>();
}
@Override
public void addDepart(Depart department) {
computerColleageList.add(department);
}
@Override
public java.util.Iterator createIterator() {
return new ComputerColleageIterator(computerColleageList);
}
@Override
public String getName() {
return "计算机学院";
}
}
class Depart {
String name;
public Depart(String name) {
this.name = name;
}
}
class OutputIml {
List<Colleages> colleages;
public OutputIml(List<Colleages> colleages) {
this.colleages = colleages;
}
public void print() {
java.util.Iterator<Colleages> iterator = colleages.iterator();
while (iterator.hasNext()) {
Colleages colleage = iterator.next();
System.out.println("====" + colleage.getName() + "======");
java.util.Iterator iterator1 = colleage.createIterator();
printDepart(iterator1);
}
}
public void printDepart(java.util.Iterator iterator) {
while (iterator.hasNext()) {
Depart next = (Depart) iterator.next();
System.out.println(next.name);
}
}
}