DesignPattern - 迭代器模式【行为型】
# 一、迭代器模式介绍
迭代器模式(Iterator Pattern)提供一种方法顺序访问一个聚合对象中各个元素,而又无须暴露该对象的内部实现,属于行为型模式。
核心组成
- 抽象容器(Aggregate):提供创建具体迭代器角色的接口,一般是接口,包括一个 iterator()方法,例如 java 中的 Collection 接口,List 接口,Set 接口等
- 具体容器角色(ConcreteAggregate):实现抽象容器的具体实现类,比如 List 接口的有序列表实现 ArrayList,List 接口的链表实现 LinkedList,Set 接口的哈希列表的实现 HashSet 等
- 抽象迭代器角色(Iterator):负责定义访问和遍历元素的接口,包括几个核心方法,取得下一个元素的方法
next()
,判断是否遍历结束的方法isDone()
(或者叫hasNext()
),移除当前对象的方法remove()
- 具体迭代器角色(ConcreteIterator):实现迭代器接口中定义的方法,并要记录遍历中的当前位置,完成集合的迭代
应用场景
- 一般来说,迭代器模式是与集合共存的,只要实现一个集合,就需要同时提供这个集合的迭代器,就像 java 中的 Collection、List、Set、Map 等,都有自己的迭代器
- Java 中的 iterator 迭代器
优点
- 可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部的数据
- 支持以不同的方式遍历一个聚合对象
缺点
- 对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐
- 迭代器模式在遍历的同时,更改迭代器所在的集合结构会导致出现异常
# 二、迭代器模式代码实现
下面以仿写集合 List 为例
创建 抽象迭代器:
/**
* 抽象迭代器
*
* @author GitLqr
*/
public interface Iterator {
// 获取下一个元素
Object next();
// 判断是否有下一个
boolean hasNext();
}
创建 具体迭代器:
/**
* 具体迭代器
*
* @author GitLqr
*/
public class MyIterator implements Iterator {
private List list;
private int index = 0;
public MyIterator(List list) {
super();
this.list = list;
}
@Override
public Object next() {
Object obj = null;
if (hasNext()) {
obj = list.get(index);
index++;
}
return obj;
}
@Override
public boolean hasNext() {
return index < list.size();
}
}
创建 抽象容器:
/**
* 抽象容器
*
* @author GitLqr
*/
public interface ICollection {
void add(Object object);
void remove(Object object);
Iterator iterator();
}
创建具体容器:
/**
* 具体容器
*
* @author GitLqr
*/
public class MyCollection implements ICollection {
private List list = new ArrayList<>();
@Override
public void add(Object object) {
list.add(object);
}
@Override
public void remove(Object object) {
list.remove(object);
}
@Override
public Iterator iterator() {
return new MyIterator(list);
}
}
使用:
public static void main(String[] args) {
ICollection collection = new MyCollection();
collection.add("Apple");
collection.add("Banana");
collection.add("Pear");
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
- 01
- Flutter - 危!3.24版本苹果审核被拒!11-13
- 02
- Flutter - 轻松搞定炫酷视差(Parallax)效果09-21
- 03
- Flutter - 轻松实现PageView卡片偏移效果09-08