美文网首页
迭代器模式

迭代器模式

作者: 潜心之力 | 来源:发表于2020-08-17 17:55 被阅读0次

一、模式简介

定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。
场景:遍历不同的聚合结构提供统一的接口。访问聚合对象的内容而无须暴露其内部细节的表示。

  • 角色结构:
  • 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口。
  • 具体聚合(Concrete Aggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。
  • 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口。
  • 具体迭代器(Concrete lterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。

二、模式实现

public interface AbstractAggregate { -> 抽象聚合
    void add(Object o);
    void remove(Object o);
    AbstractIterator iterator();
}

public class ConcreteAggregate implements AbstractAggregate { -> 具体聚合
    private List<Object> list = new ArrayList<>();

    @Override
    public void add(Object o) {
        list.add(o);
    }

    @Override
    public void remove(Object o) {
        list.remove(o);
    }

    @Override
    public AbstractIterator iterator() {
        return new ConcreteIterator(list);
    }
}

public interface AbstractIterator { -> 抽象迭代
    Object first();
    Object next();
    boolean hasNext();
}

public class ConcreteIterator implements AbstractIterator { -> 具体迭代
    private List<Object> list;
    private int index = -1;

    public ConcreteIterator(List<Object> list) {
        if (list != null) {
            this.list = list;
        } else {
            this.list = new ArrayList<>();
        }
    }

    @Override
    public Object first() {
        return list.size() > 0 ? list.get(0) : null;
    }

    @Override
    public Object next() {
        return hasNext() ? list.get(++index) : null;
    }

    @Override
    public boolean hasNext() {
        return index < list.size() - 1;
    }
}

以遍历集合输出每个元素的信息为例子

AbstractAggregate aggregate = new ConcreteAggregate();
aggregate.add("w");
aggregate.add("j");
aggregate.add("x");
AbstractIterator iterator = aggregate.iterator();
while (iterator.hasNext()){
    System.out.println(iterator.next().toString());
}

相关文章

网友评论

      本文标题:迭代器模式

      本文链接:https://www.haomeiwen.com/subject/cegqjktx.html