迭代器模式

面临问题:

在软件构建过程中,聚集对象内部结构常常变化各异。但对于这些聚集对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“同一种算法在多种聚集对象上进行操作”提供了可能。

如果我们应该怎样才能实现对内部元素的访问呢?

解决方案:

将对聚合对象的访问和遍历从聚合对象中分离出来并放入一个迭代器(iterator)。

当我们说聚集(aggregate)的时候,我们指的是一群对象。其存储方式可以是各式各样的数据结构,例如:列表、数组、散列表,无论用什么方式存储,一律可以视为聚集。有时候也被称为“聚集(Collection)” 。 

迭代器(Iterator)模式把元素之间游走的任务交给了迭代器,而不是聚集对象。这不仅让聚集的接口和实现变得更简洁,也让它专注于管理对象,而不必理会遍历的事情。

也就是说,我们需要借助一个迭代器来进行数据元素的访问。




 Iterator(抽象迭代器)
迭代器定义访问和遍历元素的接口
 ConcreteIterator(具体迭代器)
 具体迭代器实现迭代器接口对该聚集遍历时跟踪当前位置
 Aggregate(抽象聚集类)
 聚集定义创建相应迭代器对象的接口
 ConcreteAggregate(具体聚集类)
 具体聚集实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。

具体迭代器

public class ConcreteIterator implements Iterator
{
private ConcreteAggregate objects;
public ConcreteIterator(ConcreteAggregate objects)
{
this.objects=objects;
}
public void first()
{ ...... }
public void next()
{ ...... }
public boolean hasNext()
{ ...... }
public Object currentItem()
{ ...... }
}
具体集合
public class ConcreteAggregate implements Aggregate
{
......
public Iterator createIterator()
{
return new ConcreteIterator(this);
}
......
}
在迭代器模式中蕴涵着工厂方法模式,聚集类充当了工厂类,迭代器类充当产品类。不过,聚集类不仅要创建迭代器对象。还要用到对象的行为。

因为访问聚集对象的行为,是变化的,我们要封装这种变化。封装到一个具体的迭代器类里面。以便有新的访问行为时,便于对其进行扩展。出发点不同,所以模式也不相同。一个针对创建对象,一个针对对象的行为。



相关的模式:

Composite:Iterator常被应用到复合的递归结构上
Factory Method:多态迭代器
Memento:常用Memento来捕获一个迭代的状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值