迭代器模式

1. 迭代器模式(Command Pattern)

1.1 介绍

  • 意图 :提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
  • 主要解决 :不同的方式来遍历整个整合对象。
  • 如何解决 :把在元素之间游走的责任交给迭代器,而不是聚合对象。
  • 关键代码 :定义接口:hasNext, next。

1.2 优缺点

优点

  • 它支持以不同的方式遍历一个聚合对象
  • 迭代器简化了聚合类
  • 在同一个聚合上可以有多个遍历
  • 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码

缺点

  • 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性

1.3 使用场景

  • 访问一个聚合对象的内容而无须暴露它的内部表示
  • 需要为聚合对象提供多种遍历方式。
  • 为遍历不同的聚合结构提供一个统一的接口。

1.4 注意事项

  • 迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。

2. 案例实现

我们离开宝藏秘境后,迫不及待的打开了金属箱子,箱子有3层,我们从第一层开始一层一层往下打开,发现了了不得的宝贝。

public interface BoxIterator {
    boolean hasNext();
    Object next();
}

public class MetalBox {
    // 这也算宝物?
    private String[] treasure = {"语文书","数学书","英语书"};

    public NameIterator getIterator() {
        return new NameIterator();
    }
    
    private class NameIterator implements BoxIterator{
        int idx = 0;
        
        public boolean hasNext(){
            if(idx < treasure.length){
                return true;
            }
            return false;
        }
        
        public Object next(){
            if(this.hasNext()){
                return treasure[idx++];
            }
            return null;
        }
    }
}

/**
 * 迭代器模式
 *
 *@Author cly
 *@Date 2021/09/01 0:31
 *@Version 1.0
 */
public class Iterator {
    public static void main(String[] args) {
        MetalBox metalBox = new MetalBox();
        for(BoxIterator iter = metalBox.getIterator(); iter.hasNext();){
            System.out.println(iter.next());
        }
    }
}

3. 源码实现

java中很多集合类中都封装了迭代器内部类,提供了通过迭代器类来迭代集合元素的功能

上一篇:2021-11-08


下一篇:干货 | 教你一文掌握数据预处理