问题
迭代器模式其实很好理解,不过我还是举一个我的电脑城的问题来引入吧。话说我的仓库存了50台电脑,今天的打算给我的企业客户运送过去。卡车司机到仓库门口说来运50台电脑,管理员跟司机说:你再仓库的西南角搬20台,再到中间区域搬10台,再到北边搬10台,再到东边搬10台。说完司机就怒了,说你想累死我啊,你就一台一台往仓库门口放,我就一台一台往车上运,其他的我不管。这就是迭代器模式!
实现
先看下电脑的实现,加个index,标明序号
public class Computer {
private int index;
public Computer(int index) {
this.index = index;
}
@Override
public String toString() {
return "get Computer " + index;
}
}
然后是仓库,迭代器用的是java自带的,实现都一样
public class WareHouse implements Iterator<Computer> {
private List<Computer> computerList;
private Computer[] computers;
private int index = 0;
private Iterator<Computer> iterator;
public WareHouse() {
computerList = new ArrayList<>();
computers = new Computer[10];
iterator = this;
init();
}
public Iterator<Computer> getIterator() {
return iterator;
}
private void init() {
for (int i = 0; i < 10; i++) {
Computer computer = new Computer(i);
Computer computer1 = new Computer(i + 10);
computerList.add(computer);
computers[i] = computer1;
}
}
@Override
public boolean hasNext() {
return index <= 19;
}
@Override
public Computer next() {
Computer computer = index <= 9 ? computerList.get(index):computers[index - 10];
index++;
return computer;
}
}
看下执行代码
public static void main(String[] args) {
WareHouse wareHouse = new WareHouse();
Iterator<Computer> iterator = wareHouse.getIterator();
while (iterator.hasNext()) {
Computer computer = iterator.next();
System.out.println(computer.toString());
}
}
执行结果
get Computer 0
get Computer 1
get Computer 2
get Computer 3
get Computer 4
get Computer 5
get Computer 6
get Computer 7
get Computer 8
get Computer 9
get Computer 10
get Computer 11
get Computer 12
get Computer 13
get Computer 14
get Computer 15
get Computer 16
get Computer 17
get Computer 18
get Computer 19
总结
我不关心电脑在仓库里是如何存放的,我只要求我可以一个一个的取,迭代器模式就是提供了这个功能。程序员对迭代器应该都比较熟悉,经常会遇到。可能刚开始遇到的时候,会疑惑这个新出的iterator有什么用,我一个for循环就可以搞定的事,还要用iterator来做,多麻烦。当然在平常开发过程中,我们更多地遇到的是一些常见的容器类,例如List,数组,Map呀等等。因为我们比较清楚其内部实现,也就可以知道如何去做循环查询操作。
当我们遇到一些不熟悉或者复杂的容器类,例如二叉树啊,堆啊等等,我完全不知道里面数据如何存储的,但是我就是想要访问里面的数据,那么迭代器就完美的解决了这个问题。无论内部实现多么的复杂,我都可以访问内部数据。
其优缺点也比较明显,优点的话,无需了解集合的内部实现,即可遍历集合元素;缺点就是对于一些简单的集合,使用迭代器,显得有些多余。