1. 迭代器模式(Iterator Pattern)
Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(提供一种方法访问一个容器对象的各个元素,而又不需要暴露该对象的内部细节)
迭代模式是一种濒临废弃的方式, 大部分编程语言对迭代器均已提供了实现, 如Java 中的Iterator 接口. 因此一般不推荐在项目中使用迭代器模式
1.1 迭代器模式-核心
- 迭代器的目的是提供一种方法熟悉怒访问一个聚合对象中的各个元素,而无须暴露该对象的内部实现细节.
1.2 迭代器模式-类图
迭代器共有四个角色:
- Iterator: 抽象迭代器, 定义遍历元素的接口
- ConcreteIterator: 具体迭代器. 实现遍历接口, 完成容器遍历
- Aggregate: 抽象容器角色. 负责创建具体迭代器角色的接口
- ConcreateAggrate: 具体容器角色. 具体容器实现容器接口定义的方法, 创建除容纳迭代器的对象.
[外链图片转存失败(img-L2DnAytm-1566895278375)(https://raw.githubusercontent.com/zongf0504/blog-images/master/images/design-parttern/ldp-iterator-01.png)]
2. 迭代器模式实现
由于迭代器模式濒临废弃,因此笔者就给出一个简单的通用实现即可.
2.1 Iterator
public interface Iterator {
public Object next();
public boolean hasNext();
public boolean remove();
}
2.2 ConcreteIterator
import java.util.Vector;
public class ConcreteIterator implements Iterator {
private Vector vector = new Vector();
// 记录当前游标
public int cursor = 0;
public ConcreteIterator(Vector vector) {
this.vector = vector;
}
@Override
public Object next() {
Object result = null;
if (this.hasNext()) {
result = this.vector.get(this.cursor++);
}
return result;
}
@Override
public boolean hasNext() {
if (this.cursor == this.vector.size()) {
return false;
}else {
return true;
}
}
@Override
public boolean remove() {
this.vector.remove(this.cursor);
return true;
}
}
2.3 Aggregate
public interface Aggregate {
// 添加元素
public void add(Object object);
// 删除元素
public void remove(Object object);
// 由迭代器遍历所有的元素
public Iterator iterator();
}
2.4 ConcreteAggregate
public class ConcreteAggregate implements Aggregate {
private Vector vector = new Vector();
@Override
public void add(Object object) {
this.vector.add(object);
}
@Override
public void remove(Object object) {
this.vector.remove(object);
}
@Override
public Iterator iterator() {
return new ConcreteIterator(this.vector);
}
}
2.5 测试
@Test
public void test() {
Aggregate aggregate = new ConcreteAggregate();
aggregate.add("aaa");
aggregate.add(1234);
aggregate.add("ccc");
Iterator iterator = aggregate.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}