1.概述
1.1 定义
迭代器模式提供了一种方法来访问聚合对象中的各个元素,而不用暴露这个对象内部的表示,其别名为游标(Cursor)。
1.2 原理
将遍历行为分离出来,抽象为一个迭代器,专门提供遍历聚合对象内部数据的行为。
1.3 应用场景
当为聚合对象提供多种遍历方式,或者为遍历不同的聚合结构提供统一的接口时。
2.类图
3.角色
1.Iterator 表示抽象迭代器,定义了访问和遍历元素的接口。 2.ConcreteIterator 表示具体迭代器,实现了抽象迭代器接口,并在对该聚合遍历时跟踪当前的下标位置。 3.Aggregate 表示抽象聚合,定义并创建相应迭代器对象的接口。 4.ConcreteAggregate 表示具体聚合,实现了抽象聚合接口,创建和实现相应迭代器的接口,并返回一个ConcreteIterator的实例。 5.Client 表示客户端
4.优缺点
4.1 优点
1.当访问和遍历一个聚合对象的内容时,无需暴露它的内部表示。 2.可以为聚合对象提供多种遍历方式,或者提供统一的接口。
5.案例
5.1 说明
这里以遍历商品名称为案例,其中商品名称储存在一个字符串数组里面,通过迭代器从前往后进行遍历。
5.2 代码
1)抽象迭代器类
/** * 抽象迭代器类 * @author Administrator */ public interface AbstractIterator { public void next(); public boolean isLast(); public String getNextItem(); }
2)具体迭代器类
/** * 具体迭代器类 * @author Administrator */ public class ConcreteIterator implements AbstractIterator{ private String[] productsName; private int index; public ConcreteIterator(AbstractProductList list) { productsName = list.getProductsName(); index = 0; } @Override public void next() { if(index < productsName.length) { index++; } } @Override public boolean isLast() { return (index == productsName.length); } @Override public String getNextItem() { return productsName[index]; } }
3)抽象聚合对象类
/** * 抽象聚合类:抽象产品集合 * @author Administrator */ public abstract class AbstractProductList { private String[] productsName; public AbstractProductList(String[] productsName) { this.productsName = productsName; } public String[] getProductsName() { return this.productsName; } //返回迭代器对象 public abstract AbstractIterator getIterator(); }
4)具体聚合对象类
/** * 具体聚合类:具体产品集合 * @author Administrator */ public class ConcreteProductList extends AbstractProductList{ public ConcreteProductList(String[] productsName) { super(productsName); } //返回具体迭代器对象,用于遍历数据 @Override public AbstractIterator getIterator() { return new ConcreteIterator(this); } }
5)客户端类
/** * 客户端类 * @author Administrator */ public class Client { public static void main(String[] args) { String[] productsName = {"电脑","手机","充电器","耳机","手表"}; AbstractProductList list = new ConcreteProductList(productsName); //这里通过list.getIterator()获取迭代器对象 AbstractIterator iterator = list.getIterator(); while (!iterator.isLast()) { System.out.println(iterator.getNextItem()); iterator.next(); } } }
4.3 效果
电脑 手机 充电器 耳机 手表
4.4 分析
通过具体聚合对象返回其迭代器对象,然后就可用对聚合对象的数据进行遍历。