1、概念
使用Java语言显示数组arr中的元素时,我们一般使用for循环语句遍历数组。
for(int i=0;i<arr.length;i++) {
System.out.println(i);
}
那么将这里的循环变量i的作用抽象化、通用化后形成的模式,在设计模式中称为Iterator模式。
Iterator模式用于在数据集合中按照顺序遍历集合。即为迭代器模式。
意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
由上图,知一个迭代器模式可由四个角色组成。
Iterator (迭代器) : 该角色负责定义按顺序逐个遍历元素的接口(API)。
ConcreteIterator (具体的迭代器) : 该角色负责实现Iterator角色所定义的接口(API)。
Aggregate (集合): 该角色负责定义创建Iterator角色的接口(API)。
ConcreteAggregate (具体的集合) : 该角色负责实现Aggregate角色所定义的接口(API)。它会创建具体的Iterator角色,即ConcreteIterator。
2、具体实现
/**
* 迭代器接口
*/
public interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
}
/**用于生成迭代器的接口
* 该接口中只有一个方法, 这个方法用于生成一个迭代器, 并返回
* 如果某个集合想使用迭代器, 那么就应该实现这个接口
*/
public interface Aggregate {
public abstract Iterator iterator();
}
/**
* Cat是个体, 一个Cat实例代表一只猫.
* CatGroup是Cat的集合, 一个CatGroup实例代表一群猫.
*/
public class Cat {
private int age;
private String name;
public Cat(String name, int age) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
/**
* Cat是个体, 一个Cat实例代表一只猫.
* CatGroup是Cat的集合, 一个CatGroup实例代表一群猫.
*
* 并且这个类实现了Aggregate的iterator()方法来获取迭代器
*/
public class CatGroup implements Aggregate {
private int last;
private Cat[] cats;
public CatGroup(int maxsize) {
this.cats = new Cat[maxsize];
}
public Cat getByIndex(int index) {
return cats[index];
}
public void append(Cat cat) {
cats[last++] = cat;
}
public int getLength() {
return last;
}
@Override
public Iterator iterator() {
return new CatGroupIterator(this);
}
}
//集合迭代器类
public class CatGroupIterator implements Iterator {
private int index;
private CatGroup catGroup;
public CatGroupIterator(CatGroup catGroup) {
this.catGroup = catGroup;
this.index = 0;
}
@Override
public boolean hasNext() {
return index < catGroup.getLength();
}
@Override
public Object next() {
return catGroup.getByIndex(index++);
}
}
//测试类
public class Main {
public static void main(String[] args) {
// 创建一个猫群
CatGroup catGroup = new CatGroup(20);
// 向猫群里添加猫
catGroup.append(new Cat("betty", 10));
catGroup.append(new Cat("nancy", 11));
catGroup.append(new Cat("wood", 14));
catGroup.append(new Cat("zira", 18));
// 获取遍历该猫群的迭代器
Iterator iterator = catGroup.iterator();
// 迭代并输出
while (iterator.hasNext()) {
Cat c = (Cat) iterator.next();
System.out.println(c);
}
}
}