一、迭代器设计模式简介
迭代器设计模式(Iterator Pattern)
- 提供⼀种⽅法顺序访问⼀个聚合对象中各个元素, ⽽⼜⽆须暴露该对象的内部实现,属于⾏为型模式 应该是java中应⽤最多的设计模式之⼀
应用场景
- ⼀般来说,迭代器模式是与集合是共存的,只要实现⼀个集合,就需要同时提供这个集合的迭代器,就像java中的Collection,List、Set、Map等 都有自己的迭代器JAVA中的iterator迭代器
角色
- 抽象容器(Aggregate):提供创建具体迭代器⻆⾊的接⼝,⼀般是接⼝,包括⼀个iterator()⽅法,例如java 中的Collection接⼝,List接⼝,Set接⼝等。
- 具体容器⻆⾊(ConcreteAggregate):实现抽象容器 的具体实现类,⽐如List接⼝的有序列表实现 ArrayList,List接⼝的链表实现LinkedList, Set接⼝的 哈希列表的实现HashSet等。
- 抽象迭代器⻆⾊(Iterator):负责定义访问和遍历元素的接⼝,包括⼏个核⼼⽅法,取得下⼀个元素的⽅法 next(),判断是否遍历结束的⽅法isDone()(或者叫 hasNext()),移除当前对象的⽅法remove()
- 具体迭代器⻆⾊(ConcreteIterator):实现迭代器接⼝中定义的⽅法,并要记录遍历中的当前位置,完成集合的迭代
二、优缺点
优点:
- 可以做到不暴露集合的内部结构,⼜可让外部代码透明地访问集合内部的数据
- ⽀持以不同的⽅式遍历⼀个聚合对象
缺点:
- 对于⽐较简单的遍历(像数组或者有序列表),使⽤迭代器⽅式遍历较为繁琐
- 迭代器模式在遍历的同时更改迭代器所在的集合结构会导致出现异常
三、代码实现
/**
* 抽象迭代器
*/
public interface Iterator {
/**
* 获取下一个元素
* @return
*/
Object next();
/**
* 是否有下一个
* @return
*/
boolean hasNext();
/**
* 删除元素
* @param obj
* @return
*/
Object remove(Object obj);
}
/**
* 具体迭代器
*/
public class ConcreteIterator implements Iterator{
private List list;
private int index=0;
public ConcreteIterator(List list){
this.list = list;
}
/**
* 获取下一个元素
* @return
*/
@Override
public Object next() {
Object o = null;
if(this.hasNext()){
o = this.list.get(index);
index++;
}
return o;
}
/**
* 是否有下一个
* @return
*/
@Override
public boolean hasNext() {
if(index == this.list.size()){
return false;
}
return true;
}
/**
* 删除元素
* @param obj
* @return
*/
@Override
public Object remove(Object obj) {
return this.list.remove(obj);
}
}
/**
* 抽象容器
*/
public interface ICollection {
/**
* 链式调用
*/
ICollection add(Object obj);
void remove(Object obj);
Iterator iterator();
}
/**
* 具体容器
*/
public class ConcreteCollection implements ICollection{
private List list = new ArrayList();
@Override
public ICollection add(Object obj) {
list.add(obj);
return this;
}
@Override
public void remove(Object obj) {
list.remove(obj);
}
@Override
public Iterator iterator() {
return new ConcreteIterator(list);
}
}
/**
* 迭代器设计模式
*/
public class Main {
public static void main(String[] args) {
ConcreteCollection cc = new ConcreteCollection();
cc.add("李白").add("小明").add("杜甫").add("白居易").add("高楼");
Iterator iterator = cc.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
注释:个人学习观点以作笔记,如有瑕疵望谅解