设计模式是面向问题、场景而总结产生的设计思路。是解决问题的套路。23 种经典的设计模式。它们又可以分为三大类:创建型、结构型、行为型。
行为型 包含了 观察者模式、模板模式、策略模式、职责链模式、状态模式、迭代器模式、 访问者模式、备忘录模式、命令模式、解释器模式、中介模式 总共11种模式。
迭代器模式
迭代器(Iterator)模式的定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。迭代器模式是一种对象行为型模式。引入Iterator后可以将遍历与实现分离开来。
Java内部的容器多使用迭代器模式,在数据库的ResultSet游标其实也是基于迭代器模式的。
1. 模式优点
- 封装 访问一个聚合对象的内容而无须暴露它的内部表示。为遍历不同的聚合结构提供一个统一的接口。
- 简化 遍历任务交由迭代器完成,这简化了聚合类。
- 灵活 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。
2.编码实现
定义Iterator接口
interface Iterator<E> {
E first();
E next();
boolean hasNext();
}
public interface Collection {
public Iterator getIterator();
}
定义BookStore类,其内部类实现了Iterator
public class BookStore implements Collection{
private List<String> books = new ArrayList<>();
public BookStore() {
this.books.add("超人");
this.books.add("沉默");
this.books.add("编译");
}
public Iterator getIterator(){
return new ConcreteIterator();
}
private class ConcreteIterator implements Iterator{
private int index = 0;
@Override
public String first() {
return books.get(0);
}
@Override
public String next() {
if(hasNext())
return books.get(index++);
return null;
}
@Override
public boolean hasNext() {
return index<books.size();
}
}
}
通过调用迭代器访问元素
public class Main {
public static void main(String[] args) {
BookStore store = new BookStore();
Iterator iterator = store.getIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println(iterator.first());
}
}
运行结果
超人
沉默
编译
超人
总结
迭代器模式在访问容器时,将这部分逻辑抽离出来。但是在使用迭代器时,如果对元素进行了变更,java基于Fail Fast理念会抛出异常,因为这会导致难以定位的隐藏错误。
如果需要能够支持遍历时修改,除了使用并发容器外,还可以基于修改时间戳来实现,使用等长的数组保存每一个元素的添加时间、删除时间,当迭代器遍历时只访问在其有效时间范围内的数据。
设计模式系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/designpattern
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。