1. 概览
1.1 定义
迭代器模式 - 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
1.2 模式角色
- 抽象容器:一般是一个接口,主要提供 “获取迭代器” “添加元素” “删除元素”…等方法。
- 具体容器:抽象容器的具体实现类。
- 抽象迭代器:定义遍历元素所需的方法。一般为 “获取第一个元素” 的 first() 方法;"获取下一个元素"的 next() 方法;"判断是否遍历结束"的 hasNext() 方法。
- 具体迭代器:迭代器的具体实现。
2. 代码示例
迭代器接口:
package com.jbp.designpattern.iterator;
/**
* @ClassName: Iterator
* @description: 迭代器接口
* @author: JiangBeiPing
* @create: 2021-08-24 17:43
* @Version: 1.0
**/
public interface Iterator {
public boolean hasNext();
public Object next();
public Object first();
}
集合类接口:
package com.jbp.designpattern.iterator;
/**
* @ClassName: 集合类接口
* @description: Container
* @author: JiangBeiPing
* @create: 2021-08-24 17:44
* @Version: 1.0
**/
public interface Container {
public void add(Object obj);
public void remove(Object obj);
public Iterator getIterator();
}
容器接口实现类:
package com.jbp.designpattern.iterator;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName: ContainerImpl
* @description: 容器接口实现类
* @author: JiangBeiPing
* @create: 2021-08-24 17:46
* @Version: 1.0
**/
public class ContainerImpl implements Container{
public List<Object> list = new ArrayList<>();
@Override
public void add(Object obj) {
list.add(obj);
}
@Override
public void remove(Object obj) {
list.remove(obj);
}
@Override
public Iterator getIterator() {
return new ContainerIterator(list);
}
private class ContainerIterator implements Iterator{
private List<Object> list = null;
private int index = -1;
public ContainerIterator(List<Object> list) {
this.list = list;
}
@Override
public boolean hasNext() {
if (index < list.size() - 1){
return true;
}
return false;
}
@Override
public Object next() {
if (this.hasNext()){
return list.get(++index);
}
return null;
}
@Override
public Object first() {
index = 0;
return list.get(index);
}
}
}
测试类:
package com.jbp.designpattern.iterator;
/**
* @ClassName: Test
* @description: 测试类
* @author: JiangBeiPing
* @create: 2021-08-24 17:55
* @Version: 1.0
**/
public class Test {
public static void main(String[] args) {
ContainerImpl container = new ContainerImpl();
container.add("111");
container.add("222");
container.add("333");
Iterator iterator = container.getIterator();
while (iterator.hasNext()){
Object next = iterator.next();
System.out.println(next);
}
Object first = iterator.first();
System.out.println("first:"+first);
}
}
3. 优缺点
优点:
- 访问一个聚合对象的内容而无须暴露它的内部表示。
- 支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。
- 迭代器简化了聚合类。
缺点:
- 增加了类的个数,这在一定程度上增加了系统的复杂性。