迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
当需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑使用迭代器模式。需要对聚集有多种方式遍历时,可以考虑用迭代器模式。为遍历不同的聚集结构提供如开始,下一个,是否结束,当前项等统一的接口。(foreach就是迭代器模式)
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
/**
* 迭代器接口
*/
public interface Iterator {
Object first(); //返回第一个
Object next(); //返回下一个
boolean hasNext(); //是否有下一个
Object currentObj(); //返回当前对象
}
/**
* 集合接口
*/
public interface List {
void add(Object object); //新增一个
Object get(int index); //获得指定位置的对象
Iterator iterator(); //获得迭代器
int size(); //获得集合长度
}
/**
* 具体迭代器
*/
public class ConcreteIterator implements Iterator {
private List list;
private int index;
public ConcreteIterator() {
}
public ConcreteIterator(List list) {
this.list = list;
}
@Override
public Object first() {
if(list.size() > 0){
return list.get(0);
}
return null;
}
@Override
public Object next() {
if (list.size() > index){
return list.get(index++);
}
return null;
}
@Override
public boolean hasNext() {
return list.size() > index;
}
@Override
public Object currentObj() {
return list.get(index);
}
}
/**
* 具体集合
*/
public class ArrayList implements List {
private Object[] list;
private int size = 0;
private int index = 0;
public ArrayList() {
size = 0;
index = 0;
list = new Object[100];
}
@Override
public void add(Object object) {
list[index++] = object;
size++;
}
@Override
public Object get(int index) {
return list[index];
}
@Override
public Iterator iterator() {
return new ConcreteIterator(this);
}
@Override
public int size() {
return size;
}
}
public class Main {
public static void main(String[] args) {
List list = new ArrayList();
list.add("11");
list.add("22");
list.add("33");
System.out.println(list.size());
System.out.println(list.get(1));
Iterator iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}