设计模式之迭代器模式

定义

提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。

UML类图

在这里插入图片描述

代码实现

Iterator.java

public interface Iterator {

    public void first();

    public void next();

    public boolean hasNext();

    public Object currentItem();

}

Aggregate.java

public interface Aggregate {

    public Iterator createIterator();
}

ConcreteIterator.java

public class ConcreteIterator implements Iterator {

    private int cursor;
    private List<String> list;

    public ConcreteIterator(List<String> list) {
        this.list = list;
    }

    @Override
    public void first() {
        cursor = 0;
    }

    @Override
    public void next() {
        cursor++;
    }

    @Override
    public boolean hasNext() {
        if (cursor < list.size()) {
            return true;
        }
        return false;
    }

    @Override
    public Object currentItem() {
        return list.get(cursor);
    }
}

ConcreteAggregate.java

public class ConcreteAggregate implements Aggregate {

    private List<String> list;

    public ConcreteAggregate() {
        list = new ArrayList<>();
    }

    public void add(String value) {
        list.add(value);
    }


    @Override
    public Iterator createIterator() {
        return new ConcreteIterator(list);
    }
}

Main.java

ConcreteAggregate aggregate = new ConcreteAggregate();
aggregate.add("A");
aggregate.add("C");
aggregate.add("D");
aggregate.add("F");
Iterator iterator = aggregate.createIterator();
iterator.first();
while(iterator.hasNext()) {
    String value = (String) iterator.currentItem();
    iterator.next();
    System.out.println("value:"+value);
}

打印结果:

value:A
value:C
value:D
value:F

优缺点

主要优点

  1. 它支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式。在迭代器模式中只需要用一个不同的迭代器来替换原有迭代器即可改变遍历算法,我们也可以自己定义迭代器的子类以支持新的遍历方式。

  2. 迭代器简化了聚合类。由于引入了迭代器,在原有的聚合对象中不需要再自行提供数据遍历等方法,这样可以简化聚合类的设计。

  3. 在迭代器模式中,由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足“开闭原则”的要求。

主要缺点

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

  2. 抽象迭代器的设计难度较大,需要充分考虑到系统将来的扩展,例如JDK内置迭代器Iterator就无法实现逆向遍历,如果需要实现逆向遍历,只能通过其子类ListIterator等来实现,而ListIterator迭代器无法用于操作Set类型的聚合对象。在自定义迭代器时,创建一个考虑全面的抽象迭代器并不是件很容易的事情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值