迭代器模式学习总结

一、概念

一个聚合对象具有两个职责,一是存储内部的数据,二是遍历内部数据。从依赖性看,前者是聚合对象的根本属性,后者则是可以变化,分离的。将聚合对象的遍历行为抽取为一个迭代器,专门提供遍历聚合对象内部数据的行为,这边是迭代器。

二、类图

这里写图片描述

三、实例之商品名称遍历

代码:

/*
 * 抽象迭代器类
 */
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.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值