定义
提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
角色
- 抽象迭代器 定义了迭代器内部该有的方法
- 具体迭代器 抽象迭代器的实现,has a 具体可迭代对象
- 抽象容器 提供创建迭代器的方法以及一组集合对象的操作方法
- 具体容器 实现了抽象容器
实现
/**
* desc : 抽象迭代器
* Created by tiantian on 2018/8/12
*/
public interface Iterator {
Object next();
boolean hasNext();
}
/**
* desc : 具体列表表迭代器
* Created by tiantian on 2018/8/12
*/
public class ListIterator implements Iterator {
private MyList list;
private int index;
public ListIterator(MyList list) {
this.list = list;
index = 0;
}
@Override
public Object next() {
Object obj = list.get(index);
index ++;
return obj;
}
@Override
public boolean hasNext() {
if (index >= list.size()) {
return false;
} else {
return true;
}
}
}
/**
* desc : 抽象容器
* Created by tiantian on 2018/8/12
*/
public interface MyList {
void add(Object obj);
void remove(int i);
Object get(int i);
int size();
Iterator iterator();
}
/**
* desc : 具体容器
* Created by tiantian on 2018/8/12
*/
public class MyListImpl implements MyList {
private List list = new ArrayList();
@Override
public void add(Object obj) {
list.add(obj);
}
@Override
public void remove(int i) {
list.remove(i);
}
@Override
public Object get(int i) {
return list.get(i);
}
@Override
public int size() {
return list.size();
}
@Override
public Iterator iterator() {
return new ListIterator(this);
}
}
/**
* desc : 测试
* Created by tiantian on 2018/8/12
*/
public class Test {
public static void main(String[] args) {
MyList myList = new MyListImpl();
Iterator myListIterator = myList.iterator();
System.out.println(myListIterator.hasNext());
myList.add("hello");
myList.add("world");
myList.add("!");
while (myListIterator.hasNext()) {
System.out.println(myListIterator.next());
}
}
}
总结
迭代器模式的优势是访问一个集合对象的内容而无需暴露它的内部表示。并且可以为遍历不同的结构的集合对象提供一个统一的接口。