一、什么是迭代器模式?
我们在Java中经常会遇到集合对象,这些集合对象内部有着各种各样的实现。如果我们去遍历集合中的数据,那么就需要各种各样的实现。迭代器模式就可以解决这种场景,它分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样就可以既不暴露集合内部的结构,又可以让外部程序访问集合内的数据。就像Collection集合类中有List和Set,要去访问他们内部的数据,我们只需要建立一个Iterator就可以了。
迭代器模式涉及到以下几个角色:
1. 抽象迭代器角色:定义访问和遍历元素的接口
2. 具体迭代器角色:实现了迭代器接口并记录当前遍历的索引
3. 抽象容器(Container)角色: 负责提供创建具体迭代器角色的接口
4. 具体容器角色:创建具体迭代器角色的接口
5. 客户端:创建容器
二、迭代器模式框图
三、迭代器模式的具体实现代码
来举个例子,果农在山上种果树,本来山上是没有树的,现在要种几棵果树,然后遍历所有的数。
3.1 interface——抽象迭代器
package designpatterns.iterator;
/**
* Created by Olive on 2017/12/28.
* 抽象迭代器接口
*/
public interface Iterator {
boolean hasNext();
Object next();
}
3.2 Tree——种的树
package designpatterns.iterator;
/**
* Created by Olive on 2017/12/28.
* 树
*/
public class Tree {
private String name;
public Tree(String name){
this.name = name;
}
public String getName() {
return name;
}
}
3.3 Mountain——山,容器类,内部有建立迭代器的方法
package designpatterns.iterator;
/**
* Created by Olive on 2017/12/28.
* 山,容器类,内部有建立迭代器的方法
*/
public class Mountain {
Tree[] trees;
private int index;
public Mountain(int num){
trees = new Tree[num];
index = 0;
}
public void addTree(Tree tree){
trees[index] = tree;
index++;
}
public Iterator connectIterator(){
return new TreeIterator(this);
}
}
3.4 TreeIterator——树的迭代器,内部有容器对象的引用,并维护了一个索引
package designpatterns.iterator;
/**
* Created by Olive on 2017/12/28.
* 树的迭代器,内部有容器对象的引用,并维护了一个索引
*/
public class TreeIterator implements Iterator {
private int last = 0;
private Mountain mountain;
public TreeIterator(Mountain mountain) {
this.mountain = mountain;
}
public boolean hasNext() {
if (last < mountain.trees.length) {
return true;
} else {
return false;
}
}
public Tree next() {
Tree t = mountain.trees[last];
last++;
return t;
}
}
3.5 Client——客户端
package designpatterns.iterator;
/**
* Created by Olive on 2017/12/28.
*/
public class Client {
public static void main(String[] args){
Mountain mountain = new Mountain(4);
mountain.addTree(new Tree("樱桃树"));
mountain.addTree(new Tree("苹果树"));
mountain.addTree(new Tree("柠檬树"));
mountain.addTree(new Tree("橙子树"));
for(Iterator i = mountain.connectIterator();i.hasNext();){
String type = ((Tree) i.next()).getName();
if(type.equals("樱桃树")){
System.out.println("樱桃樱桃快长大!");
}
if(type.equals("苹果树")){
System.out.println("苹果苹果快长大!");
}
if(type.equals("柠檬树")){
System.out.println("柠檬柠檬快长大!");
}
if(type.equals("橙子树")){
System.out.println("橙子橙子快长大!");
}
}
}
}
3.6 结果
樱桃樱桃快长大!
苹果苹果快长大!
柠檬柠檬快长大!
橙子橙子快长大!
Process finished with exit code 0