十六、迭代器模式——游标指针的漫步与游走


设计模式是面向问题、场景而总结产生的设计思路。是解决问题的套路。23 种经典的设计模式。它们又可以分为三大类:创建型、结构型、行为型。

行为型 包含了 观察者模式、模板模式、策略模式、职责链模式、状态模式、迭代器模式、 访问者模式、备忘录模式、命令模式、解释器模式、中介模式 总共11种模式。

迭代器模式

迭代器(Iterator)模式的定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。迭代器模式是一种对象行为型模式。引入Iterator后可以将遍历与实现分离开来。
Java内部的容器多使用迭代器模式,在数据库的ResultSet游标其实也是基于迭代器模式的。

1. 模式优点

  • 封装 访问一个聚合对象的内容而无须暴露它的内部表示。为遍历不同的聚合结构提供一个统一的接口。
  • 简化 遍历任务交由迭代器完成,这简化了聚合类。
  • 灵活 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。

2.编码实现

定义Iterator接口

interface Iterator<E> {
    E first();
    E next();
    boolean hasNext();
}

public interface Collection {
    public Iterator getIterator();
}

定义BookStore类,其内部类实现了Iterator

public class BookStore implements Collection{
    private List<String> books = new ArrayList<>();

    public BookStore() {
        this.books.add("超人");
        this.books.add("沉默");
        this.books.add("编译");
    }

    public Iterator getIterator(){
        return new ConcreteIterator();
    }

    private class ConcreteIterator implements Iterator{
        private int index = 0;

        @Override
        public String first() {
            return books.get(0);
        }

        @Override
        public String next() {
            if(hasNext())
                return books.get(index++);
            return null;
        }

        @Override
        public boolean hasNext() {
            return index<books.size();
        }
    }
}

通过调用迭代器访问元素

public class Main {
    public static void main(String[] args) {
        BookStore store = new BookStore();
        Iterator iterator = store.getIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
        System.out.println(iterator.first());
    }
}

运行结果

超人
沉默
编译
超人

总结

迭代器模式在访问容器时,将这部分逻辑抽离出来。但是在使用迭代器时,如果对元素进行了变更,java基于Fail Fast理念会抛出异常,因为这会导致难以定位的隐藏错误。
如果需要能够支持遍历时修改,除了使用并发容器外,还可以基于修改时间戳来实现,使用等长的数组保存每一个元素的添加时间、删除时间,当迭代器遍历时只访问在其有效时间范围内的数据。

设计模式系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/designpattern
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值