迭代器模式
迭代器模式(Iterator Pattern)是一种非常常用的设计模式,这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。
介绍
意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部结构。
解决:不同的方式来遍历整个整合对象。
设计思想:把在元素之间游走的责任交给迭代器,而不是聚合对象。
接口包含:hasNext, next。
优点: 1、支持不同的方式来遍历对象。 2、简化了java内部结构。 3、在一个类中可以有多个迭代器。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
使用场景: 1、不暴露类中的底层机构。 2、需要为类提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口。
思想:迭代器模式分离了集合对象的遍历行为和数据存储行为,将两个行为分开,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
JDK中典型使用了迭代器设计模式的是集合类(List,set),下面对ArrayList进行分析,实现步骤:
1. 定义一个迭代器接口,里面包含迭代器最基本的方法。
2. 在集合的实现类(ArrayList)中,定义一个内部类实现迭代器接口,并用private作用类的修饰符(保证此类对外不可见)。
3. 对外提供迭代器接口的引用。
// 迭代器对外访问实现
public java.util.Iterator<E> iterator() {
return new ArrayList.Itr();
}
/**
* 遍历行为,private修饰符,对外不可见。
实现了迭代器接口
*/
private class Itr implements java.util.Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
// 判断是否存在下个元素
public boolean hasNext() {
return cursor != size;
}
// 获取下一个元素
public E next() {
//...
return (E) elementData[lastRet = i];
}
// 移除迭代器中的元素
public void remove() {
//...
}
}
栗子:
1. 创建接口:
package itereatorTest;
public interface Container {
Iterator getIterator();
}
package itereatorTest;
public interface Iterator {
boolean hasNext();
Object next();
}
2. 创建container接口的实现类,实现类内部类IteratorImpl现实现了迭代器Iterator
package itereatorTest;
public class ContainerImpl implements Container{
String [] names = {"zhangsan","lisi","wanger","zhaowu"};
@Override
public Iterator getIterator() {
return new IteratorImpl();
}
// 内部类,实现了迭代器接口
private class IteratorImpl implements Iterator{
int index;
@Override
public boolean hasNext() {
return index < names.length;
}
@Override
public Object next() {
if (this.hasNext()) {
return names[index++];
}
return null;
}
}
}
3. 测试类
package itereatorTest;
// 测试类
public class MainTest {
public static void main(String[] args) {
Container container = new ContainerImpl();
Iterator iterator = container.getIterator();
while (iterator.hasNext()) {
System.out.println("name :" +iterator.next());
}
}
}
4. 测试结果:
name :zhangsan
name :lisi
name :wanger
name :zhaowu