目录
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露对象的内部表示。
分离了集合对象和遍历逻辑:迭代器模式将集合对象的内部结构和遍历逻辑分离,使得集合对象更加简化,同时提供了一种统一的遍历方式。
支持多种遍历方式:迭代器模式可以支持不同的遍历方式,例如顺序遍历、逆序遍历等,而不需要修改聚合对象。
可扩展性:通过添加新的具体迭代器类,可以轻松扩展迭代器模式,以支持新的遍历方式。
增加了复杂性:引入迭代器模式可能会增加代码的复杂性,因为需要定义迭代器接口和具体迭代器类。
迭代器接口(Iterator Interface):定义了访问和遍历聚合对象元素的方法,通常包括 next
(获取下一个元素)和 hasNext
(检查是否还有下一个元素)等方法。
具体迭代器(Concrete Iterator):实现迭代器接口,负责实现具体的迭代逻辑,包括追踪当前位置、获取下一个元素等。
聚合接口(Aggregate Interface):定义了创建迭代器对象的方法,通常包括 createIterator
等方法。
具体聚合类(Concrete Aggregate):实现了聚合接口,负责创建具体的迭代器对象,并提供对聚合元素的访问方式。
客户端通过聚合对象的工厂方法(如 createIterator
)获取迭代器对象。
客户端使用迭代器对象来遍历聚合对象的元素,通过调用 next
方法获取下一个元素,通过 hasNext
方法检查是否还有下一个元素。
迭代器对象内部维护了对聚合对象的引用,以便能够顺序访问聚合对象的元素。
当我们需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代器模式。
1.创建迭代器接口,有两种定义方式,此处采用的是方式一:
// 接口定义方式一 public interface Iterator{ boolean hasNext(); E next(); }
public interface Iterator{ boolean hasNext(); void next(); E currentItem(); }
2.创建具体迭代器
public class ConcreteIteratorimplements Iterator { private List collection; private int index; public ConcreteIterator(List collection){ this.collection = collection; this.index =0; } @Override public boolean hasNext() { return index < collection.size(); } @Override public T next() { if (hasNext()){ T item = collection.get(index); index++; return item; } return null; } }
3.创建聚合接口,主要是定义创建迭代器的方法
public interface Aggregate{ Iterator createIterator(); }
4.创建具体聚合类,创建迭代器对象,提供对聚合元素的访问方式
public class ConcreteAggregateimplements Aggregate{ private List collection; public ConcreteAggregate(){ this.collection = new ArrayList<>(); } public void addItem(T item){ this.collection.add(item); } @Override public Iterator createIterator() { return new ConcreteIterator(collection); } }
5.客户端遍历
public class IteratorClient { public static void main(String[] args) { ConcreteAggregateaggregate = new ConcreteAggregate<>(); aggregate.addItem(1); aggregate.addItem(2); aggregate.addItem(3); Iterator iterator = aggregate.createIterator(); while (iterator.hasNext()){ Integer item = iterator.next(); System.out.println(item); } } }
当需要以统一的方式访问不同类型的聚合对象(如列表、树、图等)的元素时,可以考虑使用迭代器模式。
当需要隐藏聚合对象的内部表示,并提供一种统一的访问方式时,迭代器模式非常有用。
当需要在不依赖聚合对象的具体类的情况下遍历聚合对象的元素时,可以使用迭代器模式。
迭代器模式的本质是提供一种统一的方式来访问聚合对象的元素,将迭代逻辑封装到迭代器对象中。
单一职责原则(Single Responsibility Principle):迭代器模式将迭代逻辑从聚合对象中分离出来,使得每个类都有一个单一的职责。
迭代器模式通常与职责链模式(Chain of Responsibility Pattern)结合使用,以实现复杂的过滤和遍历逻辑。
Java中的迭代器:Java中的集合框架(如ArrayList、HashSet等)都提供了内置的迭代器,可以用于遍历集合中的元素。
.NET中的LINQ:Language-Integrated Query(LINQ)是.NET框架中的一个功能,它允许使用类似SQL的查询语言来查询集合数据,背后使用了迭代器模式。
Spring框架 - 数据访问:Spring框架中的JdbcTemplate使用了迭代器模式来遍历数据库查询结果集。
Android中的Cursor:在Android中,Cursor对象用于遍历数据库查询结果,实际上是迭代器模式的应用。