行为型模式(Behavioral Pattern)是对不同的对象之间划分责任和算法的抽象化;
行为型模式共有11种:
■ 模板方法模式
■ 命令模式
■ 责任链模式
■ 策略模式
■ 迭代器模式
■ 中介者模式
■ 观察者模式
■ 备忘录模式
■ 访问者模式
■ 状态模式
■ 解释器模式
一、迭代器模式的简介
■ 提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节;
■ 迭代器模式(Iterator Pattern)被广泛地应用到 Java 的API中;
Java的集合(Collection)框架中,就广泛使用迭代器来遍历集合中的元素;

image.png
迭代器模式4个角色:
■ 抽象迭代器(Iterator)角色:
该角色负责定义访问和遍历元素的接口;
■ 具体迭代器(Concrete Iterator)角色:
该角色实现Iterator接口,完成容器元素的遍历;
■ 抽象聚集(Aggregate)角色:
该角色提供创建迭代器角色的接口;
■ 具体聚集(Concrete Aggregate)角色:
该角色实现抽象聚集接口,创建出容纳迭代器的对象;
/**
* 抽象迭代器
*/
public interface Iterator {
Object next();
boolean hasNext();
}
/**
* 抽象聚集
*/
public interface Aggregate {
void add(Object obj);
Iterator createIterator();
}
/**
* 具体迭代器
*/
public class ConcreteIterator implements Iterator{
private ConcreteAggregate agg;
private int index = 0;
private int size = 0;
public ConcreteIterator(ConcreteAggregate agg) {
this.agg = agg;
size = agg.size();
index = 0;
}
/**
* 返回下一个元素
* @return
*/
@Override
public Object next() {
if(index < size){
return agg.getElement(index ++);
}else{
return null;
}
}
/**
* 是否有下一个元素,即还没有遍历结束
* @return
*/
@Override
public boolean hasNext() {
return index < size;
}
}
/**
* 具体聚集
*/
public class ConcreteAggregate implements Aggregate{
private Vector vector = new Vector();
@Override
public void add(Object obj) {
this.vector.add(obj);
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
public Object getElement(int index){
if(index < vector.size()){
return vector.get(index);
}else{
return null;
}
}
public int size(){
return vector.size();
}
}
/**
* 应用代码
*/
public class Client {
public static void main(String[] args){
Aggregate agg = new ConcreteAggregate();
agg.add("张三");
agg.add("李四");
agg.add("王五");
Iterator iterator = agg.createIterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
# 控制台输出:
张三
李四
王五
二、迭代器模式的优缺点
迭代器模式的优点:
■ 迭代器模式简化了访问容器元素的操作,具备一个统一的遍历接口;
■ 封装遍历算法,使算法独立于聚集角色;
迭代器模式的缺点:
■ 迭代器模式给使用者一个序列化的错觉,从而产生错误;
三、迭代器模式的实例
# 使用Java API中迭代器Iterator遍历集合中的元素
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Stack;
import java.util.Vector;
/**
* 迭代器模式的实例
*/
public class IteratorDemo {
public static void main(String[] args){
// 定义一个向量集合
Vector vector = new Vector();
vector.add("向量1");
vector.add("向量2");
vector.add("向量3");
vector.add("向量4");
// 定义一个序列
ArrayList arrayList = new ArrayList();
arrayList.add("序列1");
arrayList.add("序列2");
arrayList.add("序列3");
// 定义一个栈
Stack stack = new Stack();
stack.push("A");
stack.push("B");
stack.push("C");
stack.push("D");
stack.push("E");
// 遍历各集合
java.util.Iterator iterator = vector.iterator();
System.out.println("遍历向量中的元素:");
show(iterator);
System.out.println("遍历序列中的元素:");
show(arrayList.iterator());
System.out.println("遍历栈中的元素:");
show(stack.iterator());
}
private static void show(Iterator iterator) {
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
# 控制台输出:
遍历向量中的元素:
向量1
向量2
向量3
向量4
遍历序列中的元素:
序列1
序列2
序列3
遍历栈中的元素:
A
B
C
D
E
参考:
摘录 《设计模式(Java版)》韩敬海主编;(微信读书APP中有资源,可以直接阅读)
网友评论