一、概念
一个聚合对象具有两个职责,一是存储内部的数据,二是遍历内部数据。从依赖性看,前者是聚合对象的根本属性,后者则是可以变化,分离的。将聚合对象的遍历行为抽取为一个迭代器,专门提供遍历聚合对象内部数据的行为,这边是迭代器。
二、类图
三、实例之商品名称遍历
代码:
/*
* 抽象迭代器类
*/
public interface AbstractIterator {
public void next();
public boolean isLast();
public void previous();
public boolean isFirst();
public String getNextItem();
public String getPreviousItem();
}
//抽象商品集合:抽象聚合类
public abstract class AbstractProductList {
private String []productsName;//产品名称数组
public AbstractProductList(String []productsName){
this.productsName=productsName;
}
public String[] getProductsName(){
return this.productsName;
}
public abstract AbstractIterator getIterator();
}
//具体迭代器类
public class MyIterator implements AbstractIterator{
private String []productsName;
private int index1;
private int index2;
public MyIterator(AbstractProductList list) {
productsName=list.getProductsName();
index1=0;
index2=productsName.length-1;
}
@Override
public void next() {
if(index1<productsName.length){
index1++;
}
}
@Override
public boolean isLast() {
return (index1==productsName.length);
}
@Override
public void previous() {
if(index2>-1){
index2--;
}
}
@Override
public boolean isFirst() {
return (index2==-1);
}
@Override
public String getNextItem() {
return productsName[index1];
}
@Override
public String getPreviousItem() {
return productsName[index2];
}
}
//具体商品类
public class ProductList extends AbstractProductList{
public ProductList(String[] productsName) {
super(productsName);
}
@Override
public AbstractIterator getIterator() {
return new MyIterator(this);
}
}
/*
客户端
*/
public class Client {
public static void main(String[] args) {
String []productNames={"ThinkPad 电脑","Tissot 手表","iPhone 手机",
"LV 手包"};
AbstractIterator iterator;
AbstractProductList productList;
productList=new ProductList(productNames);
iterator=productList.getIterator();//获得它对应的迭代类
while(!iterator.isLast()){//利用迭代器类进行迭代
System.out.println(iterator.getNextItem());
iterator.next();
}
System.out.println("---------------------------------");
while(!iterator.isFirst()){
System.out.println(iterator.getPreviousItem());
iterator.previous();
}
}
}
四、总结
使用时机:
需要访问一个聚合对象内部内容而不需要暴露它的内部表示,或为聚合对象提供多种迭代方式,以及为遍历不同的聚合结构提供一个统一的接口时。
We use our time to get rid of others’ expectations and find ourselves.