针对不同的需求,可能需要以不同的方式来遍历整个整合对象,但我们不希望在集合容器的抽象接口层中充斥着各种不同的遍历操作,这
时候我们就需要一种能完成下面功能的迭代器:
(1)遍历一个集合对象
(2)不需要了解聚合对象的内部结构
(3)提供多种不同的遍历方式
迭代器模式提供一种访问集合中的各个元素,而不暴露其内部表示的方法。将在元素之间游走的职责交给迭代器,而不是集合对象,从而简化
集合容器的实现,让集合容器专注于在它所应该专注的事情上,更加符合单一职责原则。
抽象迭代器
package com.lq.Iterator;
/**
* @author lq
* @PACKAGE_NAME: com.lq.Iterator
* @CLASS_NAME: Iterator_
* @date 2022/11/9 21:41
* @Description: 迭代器角色(Iterator)提供了在集合容器元素之间游走的方法。
*/
public interface Iterator_<E> {
boolean hasNext();
E next();
}
抽象容器类
package com.lq.Iterator;
/**
* @author lq
* @PACKAGE_NAME: com.lq.Iterator
* @CLASS_NAME: Collection_
* @date 2022/11/9 21:42
* @Description: 抽象容器类,一般是一个接口,提供一个iterator()方法
*/
public interface Collection_<E> {
void add(E o);
int size();
Iterator_ iterator();
}
具体容器类(内部类-- 具体迭代器角色)
package com.lq.Iterator;
/**
* @author lq
* @PACKAGE_NAME: com.lq.Iterator
* @CLASS_NAME: ArrayList_
* @date 2022/11/9 21:42
* @Description: 具体容器类,实现抽象容器类 ,返回该聚合对象的迭代器。
*/
public class ArrayList_<E> implements Collection_<E> {
E[] objects = (E[])new Object[10];
//objects中下一个空的位置在哪儿,或者说,目前容器中有多少个元素
private int index = 0;
@Override
public void add(E o) {
if(index == objects.length) {
E[] newObjects = (E[])new Object[objects.length*2];
System.arraycopy(objects, 0, newObjects, 0, objects.length);
objects = newObjects;
}
objects[index] = o;
index ++;
}
@Override
public int size() {
return index;
}
/**
* 调用内部类,好处:自己的迭代器只对自己开放,不能随便调用
*/
@Override
public Iterator_<E> iterator() {
return new ArrayListIterator<>();
}
/**
* 具体迭代器角色(Concrete Iterator):实现迭代器接口中定义的方法,完成集合的迭代。
* @param
*/
private class ArrayListIterator<E> implements Iterator_<E> {
private int currentIndex = 0;
@Override
public boolean hasNext() {
if(currentIndex >= index) {
return false;
}
return true;
}
@Override
public E next() {
E o = (E)objects[currentIndex];
currentIndex ++;
return o;
}
}
}
测试
package com.lq.Iterator;
/**
* @author lq
* @PACKAGE_NAME: com.lq.Iterator
* @CLASS_NAME: Main
* @date 2022/11/9 21:42
* @Description:
*/
public class Main {
public static void main(String[] args) {
Collection_<String> list = new ArrayList_<>();
for (int i = 0; i < 15; i++) {
list.add("测试 :" + i);
}
System.out.println("长度 :" + list.size());
//这个接口的调用方式:
Iterator_<String> it = list.iterator();
while (it.hasNext()) {
String o = it.next();
System.out.println(o);
}
}
}
结果
长度 :15
测试 :0
测试 :1
测试 :2
测试 :3
测试 :4
测试 :5
测试 :6
测试 :7
测试 :8
测试 :9
测试 :10
测试 :11
测试 :12
测试 :13
测试 :14