迭代器模式

124 阅读2分钟

这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战

迭代器模式

提供一个对象来顺序访问聚合对象中的各个数据,而不暴露聚合对象的内部表示;
主要作用是可以制定不同的方式来遍历整个对象

结构

  1. 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口。
  2. 具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。
  3. 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。
  4. 具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。

image.png

演示

1、抽象聚合类

public interface Factory {
    public void add(Object obj);
    public void remove(Object obj);
    public Iterator getInIterator();
}

2、具体聚合类

public class ConcreteFactory implements Factory{
    private List<Object> list = new ArrayList<>();
    @Override
    public void add(Object obj) {
        if (obj != null) {
            list.add(obj);
        }
    }
    @Override
    public void remove(Object obj) {
        if (list.contains(obj)) {
            list.remove(obj);
        }
    }
    @Override
    public Iterator getInIterator() {
        return new ConcreteIterator(this.list);
    }
}

3、抽象迭代器

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

4、具体迭代器

public class ConcreteIterator implements Iterator {
    private List<Object> list;
    private Integer index = 0;
    public ConcreteIterator(List<Object> list) {
        this.list = list;
    }
    @Override
    public Object next() {
    if (this.hasNext()) {
        return list.get(index++);
    }
    return null;
    }
    @Override
    public boolean hasNext() {
        if (index < list.size()) {
            return true;
        } else {
            return false;
        }
    }
}

5、客户端

public class Client {
    public static void main(String[] args) {
        Factory factory = new ConcreteFactory();
        factory.add("上衣");
        factory.add("裤子");
        factory.add("鞋子");
        Iterator iterator = factory.getInIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
            // 上衣
            // 裤子
            // 鞋子
        }
    }
}

总结

一般情况,我们自己开发时很少自定义迭代器,因为java本身已经把迭代器做到内部中了;如常用的list和set。。。

优点

1、新增聚合类和迭代器类都很方便,无须改变源码

2、支持不同方式遍历聚合类,可以自定义迭代器子类支持新的遍历方式

3、遍历不同结构的聚合对象都用同一个接口,封装性好

缺点

没有太明显的缺点,新增不同聚合类或者不同遍历方式时,类的数量增加,提示系统的复杂性