简介
迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。
在迭代器模式中,提供了一个外部的迭代器来对聚合对象进行访问和遍历,迭代器定义了一个访问该聚合元素的接口,并且可以跟踪当前遍历的元素,了解哪些元素已经遍历过而哪些没有。迭代器的引入,将使得对一个复杂聚合对象的操作变得简单。
在迭代器模式中应用了工厂方法模式,抽象迭代器对应于抽象产品角色,具体迭代器对应于具体产品角色,抽象聚合类对应于抽象工厂角色,具体聚合类对应于具体工厂角色。
角色
迭代器模式有如下几个角色:
Iterator(抽象迭代器):它定义了访问和遍历元素的接口,声明了用于遍历数据元素的方法,例如:用于获取第一个元素的first()方法,用于访问下一个元素的next()方法,用于判断是否还有下一个元素的hasNext()方法,用于获取当前元素的currentItem()方法等,在具体迭代器中将实现这些方法。
ConcreteIterator(具体迭代器):它实现了抽象迭代器接口,完成对聚合对象的遍历,同时在具体迭代器中通过游标来记录在聚合对象中所处的当前位置,在具体实现时,游标通常是一个表示位置的非负整数。
Aggregate(抽象聚合类):它用于存储和管理元素对象,声明一个createIterator()方法用于创建一个迭代器对象,充当抽象迭代器工厂角色。
ConcreteAggregate(具体聚合类):它实现了在抽象聚合类中声明的createIterator()方法,该方法返回一个与该具体聚合类对应的具体迭代器ConcreteIterator实例。
说明 :
1)Iterator :迭代器接口,是系统提供,含义 hasNext、next、remove
2)ConcreteIterator:具体的迭代器类,管理迭代。
3)Aggregate :一个统一的聚合接口,将客户端和具体聚合解耦。
4)ConcreteAggreage :具体的聚合持有对象集合,并提供一个方法,返回一个迭代器,该迭代器可以正确遍历集合
5)Client:客户端,通过Iterator和Aggregate依赖子类。
各个角色之间结构关系如下:
简单示例
1.创建Iterator(抽象迭代器)
public interface Iterator {
public boolean hasNext();
public Object next();
}
2.创建ConcreteIterator(具体迭代器)
public class NameIterator implements Iterator {
int index;
Letter letter = new Letter();
@Override
public boolean hasNext() {
if (index < letter.names.length) {
return true;
}
return false;
}
@Override
public Object next() {
if (this.hasNext()){
return letter.names[index++];
}
return null;
}
}
3.因为是简单示例,Aggregate(抽象聚合类)与ConcreteAggregate(具体聚合类)暂时用一个简单实现
public class Letter {
public String names[] = {"W","L","Y","X"};
public Iterator getIterator(){
return new NameIterator();
}
}
4.创建Client(Main)
public class IteratorMain {
public static void main(String[] args) {
Letter letter = new Letter();
for (Iterator iterator=letter.getIterator();iterator.hasNext();){
String name = (String) iterator.next();
System.out.println("Name is :" + name);
}
}
}