文章目录
十九、迭代器设计模式
19.1 迭代器设计模式简介
19.1.1 迭代器设计模式概述
迭代器设计模式(Iterator Pattern):它提供一种按顺序访问容器中对象的元素,而又无须暴露该容器的内部表示。迭代器模式可以为不同的容器提供一致的遍历行为,而不用关心容器内部元素的组成结构;
迭代器模式的核心是把容器中的元素的迭代抽离到迭代器中,提供一致访问的接口;
它适用于以下场景:
- 1)访问一个容器对象的内容而无须暴露他的内部表示
- 2)为遍历不同的容器结构提供一个统一的访问(迭代)接口
19.1.2 迭代器设计模式的UML类图
迭代器设计模式主要4个角色:
- 1)抽象迭代器(Iterator):定义访问和遍历聚合元素的接口
- 2)具体迭代器(ConcreteIterator):提供具体迭代的行为
- 3)抽象容器(IAggregate):定义存储、添加、删除聚合元素以及创建迭代器对象的接口。
- 4)具体容器(ConcreteAggregate):对抽象容器进行实现
19.2 迭代器设计模式的实现
【案例】
编写一个容器,提供增、删元素的方法;并提供迭代这些元素的方法;
- 1)编写抽象迭代器:
package com.pattern.demo01_手动实现观察者设计模式;
/**
* @author lscl
* @version 1.0
* @intro:
*/
public interface Iterator<E> {
E next();
boolean hasNext();
}
- 2)编写具体迭代器:
package com.pattern.demo01_手动实现观察者设计模式;
import java.util.List;
/**
* @author lscl
* @version 1.0
* @intro:
*/
public class IteratorImpl<E> implements Iterator<E> {
// 需要迭代的容器
private List<E> list;
// 记录迭代的位置
private int cursor = 0;
// 当前迭代的元素
private E element;
public IteratorImpl(List<E> list) {
this.list = list;
}
@Override
public E next() {
element = list.get(cursor);
cursor++;
return this.element;
}
@Override
public boolean hasNext() {
// 已经获取到list集合最大索引值
if (cursor >= list.size()) {
return false;
}
return true;
}
}
- 3)定义抽象容器:
package com.pattern.demo01_手动实现观察者设计模式;
/**
* @author lscl
* @version 1.0
* @intro:
*/
public interface IAggregate<E> {
void add(E e);
void remove(E e);
Iterator<E> iterator();
}
- 4)定义具体容器:
package com.pattern.demo01_手动实现观察者设计模式;
import java.util.ArrayList;
import java.util.List;
/**
* @author lscl
* @version 1.0
* @intro:
*/
public class AggregateImpl<E> implements IAggregate<E> {
private List<E> list;
public AggregateImpl() {
this.list=new ArrayList<>();
}
@Override
public void add(E e) {
list.add(e);
}
@Override
public void remove(E e) {
list.remove(e);
}
@Override
public Iterator<E> iterator() {
return new IteratorImpl<>(list);
}
}
19.3 迭代器设计模式的优缺点
- 优点:
- 1)解耦了迭代与集合,迭代器模式封装了具体的迭代算法,迭代算法的变更不会影响集合本身
- 2)元素迭代功能多样化,每个集合对象都可以提供一个或多个迭代规则,使得同种元素可以不同的迭代行为
- 3)简化集合对象,迭代器模式将集合本身应该提供的迭代功能抽离到迭代器中,使得集合无须关心迭代行为
- 缺点:
- 1)增加的类的数量,增加了系统的复杂性
- 2)对于比较简单的遍历(数组),使用迭代器将会变得比较繁琐,另外,在日常开发中,我们基本上不会自己编写迭代器,开源框架提供的API完全够用,除非需要定制一个自己实现的数据结构对应的迭代器;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131684.html