迭代器模式

/ 设计模式

迭代器模式(Iterator)

提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示

GoF23种设计模式中,属于行为型模式( Behavioral Patterns)

这种模式在日常开发中很少用,如果是底层设计,说不定会用的上。

实例

迭代器模式总览

角色说明

举例

我们以点仓库为例。

角色说明

uml

迭代器模式举例

code

public interface Depository {

    void add(Goods goods);

    void remove(Goods goods);

    GoodsIterator getIterator();
}
public class HzDepository implements Depository{

    private List<Goods> goodsList;

    public HzDepository(List<Goods> goodsList) {
        this.goodsList = goodsList;
    }

    @Override
    public void add(Goods goods) {
        goodsList.add(goods);
    }

    @Override
    public void remove(Goods goods) {
        goodsList.remove(goods);
    }

    @Override
    public GoodsIterator getIterator() {
        return new GoodsIteratorImpl(goodsList);
    }
}
public interface GoodsIterator {

    Goods nextGoods();

    boolean isLast();
}
public class GoodsIteratorImpl implements GoodsIterator {

    private List<Goods> goodsList;
    private int index;

    public GoodsIteratorImpl(List<Goods> goodsList) {
        this.goodsList = goodsList;
    }

    @Override
    public Goods nextGoods() {
        Goods goods = goodsList.get(index);
        index++;
        return goods;
    }

    @Override
    public boolean isLast() {
        return index >= goodsList.size();
    }
}
public class Goods {

    private String name;

    public Goods(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public class Client {
    public static void main(String[] args) {

        List<Goods> goodsList = Lists.newArrayList(new Goods("mac"), new Goods("iphone"), new Goods("iphone watch"));

        //第一次遍历
        HzDepository hzDepository = new HzDepository(goodsList);
        displayGoods(hzDepository);

        //下架iphone watch,第二次遍历
        System.out.println("\n下架iphone watch,第二次遍历\n");

        hzDepository.remove(goodsList.get(2));
        displayGoods(hzDepository);
    }

    private static void displayGoods(Depository depository) {
        GoodsIterator iterator = depository.getIterator();
        while (!iterator.isLast()) {
            Goods goods = iterator.nextGoods();
            System.out.println(goods.getName());
        }
    }
}
mac
iphone
iphone watch

下架iphone watch,第二次遍历

mac
iphone

实例

code:java.util.ArrayList.Itr

角色说明

总结

迭代器模式可以遍历一个聚合对象而不暴露其内部具体内容,并且可以为不同的聚合对象提供统一的遍历接口。如果是自定义的数据结构,迭代模式可以参考,一般业务和设计中用不到此模式。