设计模式14之迭代器模式

背景首先我们来看一段代码:
List memberList = listMember();Iterator iterator = memberList.iterator();while (iterator.hasNext()) {Member next = iterator.next();...}上面的代码是使用迭代器遍历List 。 我们来看看下面的遍历方法:
for (Member member : memberList) {...}上面的遍历为直接遍历 。
直接遍历是集合直接参与的遍历的过程中 , 这里的遍历方法与集合对象的耦合性太高了 。 如果我们在直接遍历中操作集合 , 就出现操作异常 。
使用迭代器遍历 , 我们分离了集合对象与其遍历行为 , 客户端遍历集合时 , 是通过迭代器操作的 , 对客户端来说 , 隐藏了集合内部细节 。 使用迭代器遍历 , 我们在遍历集合的同时操作集合也不会有问题 。
实际上迭代器遍历就是使用了迭代器模式 。
什么是迭代器模式“
Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(它提供一种方法访问一个容器对象中各个元素 , 而又不需暴露该对象的内部细节 。 )

迭代器模式主要有下面4个要素组成:
“抽象聚合(Aggregate)角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口 。 具体聚合(ConcreteAggregate)角色:实现抽象聚合类 , 返回一个具体迭代器的实例 。 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口 , 通常包含 hasNext()、first()、next() 等方法 。 具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法 , 完成对聚合对象的遍历 , 记录遍历的当前位置 。 ”
迭代器模式结构图如下:
设计模式14之迭代器模式文章插图
代码实现Aggregatepublic interface Aggregate {void add(Object obj);void remove(Object obj);Iterator getIterator();}Iteratorpublic interface Iterator {Object first();Object next();boolean hasNext();}ConcreteAggregate
设计模式14之迭代器模式文章插图
ConcreteIterator
设计模式14之迭代器模式文章插图
测试代码:
设计模式14之迭代器模式文章插图
测试结果:
聚合的内容有:微信号:Lvshen_9 头条号:Lvshen的技术小屋 CSDN:Lvshen的技术小屋 First:微信号:Lvshen_9关于迭代器模式的思考在Java中 , 集合都提供了迭代器类 。 如果我们自己要写类似集合的聚合类时 , 我们就可以使用迭代器类 。 使用迭代器模式 , 聚合对象无需暴露内部细节可能被访问 , 这样保护了聚合对象数据的安全性 。
【设计模式14之迭代器模式】其实在Java开发中 , 你可能会使用不到迭代器模式 , 因为在Java类库中 , 需要使用迭代器模式的类库都已经提供了迭代器类 。