这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战
迭代器模式
提供一个对象来顺序访问聚合对象中的各个数据,而不暴露聚合对象的内部表示;
主要作用是可以制定不同的方式来遍历整个对象
结构
- 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口。
- 具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。
- 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。
- 具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。
演示
1、抽象聚合类
public interface Factory {
public void add(Object obj);
public void remove(Object obj);
public Iterator getInIterator();
}
2、具体聚合类
public class ConcreteFactory implements Factory{
private List<Object> list = new ArrayList<>();
@Override
public void add(Object obj) {
if (obj != null) {
list.add(obj);
}
}
@Override
public void remove(Object obj) {
if (list.contains(obj)) {
list.remove(obj);
}
}
@Override
public Iterator getInIterator() {
return new ConcreteIterator(this.list);
}
}
3、抽象迭代器
public interface Iterator {
public Object next();
public boolean hasNext();
}
4、具体迭代器
public class ConcreteIterator implements Iterator {
private List<Object> list;
private Integer index = 0;
public ConcreteIterator(List<Object> list) {
this.list = list;
}
@Override
public Object next() {
if (this.hasNext()) {
return list.get(index++);
}
return null;
}
@Override
public boolean hasNext() {
if (index < list.size()) {
return true;
} else {
return false;
}
}
}
5、客户端
public class Client {
public static void main(String[] args) {
Factory factory = new ConcreteFactory();
factory.add("上衣");
factory.add("裤子");
factory.add("鞋子");
Iterator iterator = factory.getInIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
// 上衣
// 裤子
// 鞋子
}
}
}
总结
一般情况,我们自己开发时很少自定义迭代器,因为java本身已经把迭代器做到内部中了;如常用的list和set。。。
优点
1、新增聚合类和迭代器类都很方便,无须改变源码
2、支持不同方式遍历聚合类,可以自定义迭代器子类支持新的遍历方式
3、遍历不同结构的聚合对象都用同一个接口,封装性好
缺点
没有太明显的缺点,新增不同聚合类或者不同遍历方式时,类的数量增加,提示系统的复杂性