应用场景:
迭代器模式提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。,是与集合共生共死的,一般来说,我们只要实现一个集合,就需要同时提供这个集合的迭代器;但是,由于容器与迭代器的关系太密切了,所以大多数语言在实现容器的时候都给提供了迭代器,我们都知道增强for循环,并且这些语言提供的容器和迭代器在绝大多数情况下就可以满足我们的需要,所以现在需要我们自己去实践迭代器模式的场景还是比较少见的,我们只需要使用语言中已有的容器和迭代器就可以了。
这里我们自定义集合对象,自定义集合对象的迭代器来完成对集合对象的遍历操作
/**
* 定义一个自己的集合接口,类似于list需要实现的接口,来表达集合功能
* @author Administrator
*
*/
public interface MyCollection {
//增加
public void add(Object obj);
//移除
public void remove(int index);
//迭代器
public Iterator iterator();
}
-------------------------------------
/**
* 自定义集合。实现自定义的集合接口
* @author Administrator
*
*/
public class MyList implements MyCollection {
private List<Object> list;
//单例模式的饿汉式
private static Iterator iterator = null;
public MyList(List<Object> list) {
super();
this.list = list==null?new ArrayList<>():list;
}
@Override
public void add(Object obj) {
list.add(obj);
}
@Override
public void remove(int index) {
list.remove(index);
}
@Override
public Iterator iterator() {
if(iterator==null){
iterator = new CreateIterator(list);
}
return iterator;
}
}
-------------------------------------------------------
/**
* 定义迭代器需要的实现接口,迭代器所需功能
* @author Administrator
*
*/
public interface Iterator {
public void next();
public boolean hasNext();
public Object getCurrent();
public void reSetCursor();
}
-------------------------------------------
/*
* 定义一个迭代器,它与具体的要迭代的集合相关联
* @author Administrator
*
*/
public class CreateIterator implements Iterator {
//要迭代的集合
private List<Object> list;
//当前游标
private int cursor;
//初始化迭代器集合
public CreateIterator(List<Object> list) {
super();
this.list = list;
}
@Override
public void next() {
if(hasNext()){
++cursor;
}
}
@Override
public boolean hasNext() {
if(list==null ||list.size()==0){
return false;
}else{
return ! (cursor==list.size());
}
}
@Override
public Object getCurrent() {
return list==null?null:list.get(cursor);
}
@Override
public void reSetCursor() {
cursor = 0;
}
}
-----------------------------------------------------------
public class Test {
/**
* 测试类
*/
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
list.add("aaa");
list.add("acc");
list.add("add");
list.add("aee");
list.add("aff");
//自定义集合
MyList myList = new MyList(list);
//自定义集合的迭代器
Iterator iterator = myList.iterator();
while(iterator.hasNext()){
Object current = iterator.getCurrent();
System.out.println("当前对象="+current);
iterator.next();
}
//添加和移除
System.out.println("-----添加bbbbbbbb和移除序号0------");
myList.add("bbbbbbbb");
myList.remove(0);
iterator.reSetCursor();
while(iterator.hasNext()){
Object current = iterator.getCurrent();
System.out.println("当前对象="+current);
iterator.next();
}
}
}