迭代器模式

简介: 迭代器模式标签 : Java与设计模式 迭代器模式: 提供一种方法顺序访问聚合对象(如List、Set)内的每个元素, 而又不暴露聚合对象的内部实现.

迭代器模式

标签 : Java与设计模式


迭代器模式: 提供一种方法顺序访问聚合对象(如ListSet)内的每个元素, 而又不暴露聚合对象的内部实现.

(图片来源: 设计模式: 可复用面向对象软件的基础)


模式实现

Iterator & Aggregate

  • Iterator: 迭代器
    定义访问和遍历元素的接口
  • Aggregate: 聚合
    定义创建响应迭代器对象的接口

由于Java已内置了java.lang.Iterablejava.util.Iterator接口, 而Iterable可以作为Aggregate存在(Abstract), 因此在Java中实现迭代器便可不用再定义这两个接口.


ConcreteAggregate & ConcreteIterator

  • ConcreteAggregate: 具体聚集
    实现Iterable接口, 返回ConcreteIterator的一个适当的实例;
  • ConcreteIterator : 具体迭代器
    实现Iterator接口(最好作为具体聚集的内部类), 对该聚集遍历时跟踪当前位置.
/**
 * @author jifang
 * @since 15/12/15 下午8:33.
 */
public class ConcreteAggregate implements Iterable<String> {

    private List<String> list;

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

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

    public String get(int index) {
        return list.get(index);
    }

    @Override
    public Iterator<String> iterator() {
        return new ConcreteIterator();
    }

    /**
     * 具体迭代器实现类
     */
    private class ConcreteIterator implements Iterator<String> {

        // 游标
        int cursor = 0;
        // 比游标慢一个元素
        int lastRet = -1;

        @Override
        public boolean hasNext() {
            return cursor != list.size();
        }

        @Override
        public String next() {
            if (cursor >= list.size())
                throw new NoSuchElementException();
            ++cursor;
            return list.get((lastRet = cursor - 1));
        }

        @Override
        public void remove() {
            list.remove(lastRet);
            cursor = lastRet;
            lastRet = -1;
        }
    }
}
  • Client
public class Client {

    @Test
    public void client(){
        ConcreteAggregate aggregate = new ConcreteAggregate();
        aggregate.add("aa");
        aggregate.add("bb");
        aggregate.add("remove");
        aggregate.add("cc");
        aggregate.add("dd");
        aggregate.add("remove");
        aggregate.add("ee");

        Iterator<String> iter = aggregate.iterator();
        while (iter.hasNext()){
            String item = iter.next();
            System.out.println(item);

            if (item.equals("remove")){
                iter.remove();
            }
        }

        System.out.println("********----------********");
        for (String item : aggregate){
            System.out.println(item);
        }
    }
}

小结

  • 适用

    • 访问一个聚集对象的内容而无需暴露它的内部表示;
    • 支持对聚集对象的多种遍历(如: 不光可以正向遍历, 还可以反向遍历容器元素.);
    • 为遍历不同的聚合结构提供一个统一的接口(即: 支持多态迭代).
  • Iterator使用场景不必多言, 由于Java已经将其固化到语言中,因此开发中天天都在使用:

    • 当需要访问一个聚集对象, 且不需要了解其内部实现的时, 就应该考虑使用迭代器模式.
    • 当需要对聚集有多种方式遍历时, 可以考虑使用迭代器模式.

参考
设计模式: 可复用面向对象软件的基础
迭代器模式(Iterator)- 指尖飞舞
大话设计模式
高淇讲设计模式


目录
相关文章
|
3月前
|
设计模式 安全 Java
Java设计模式-迭代器模式(21)
Java设计模式-迭代器模式(21)
|
7月前
|
设计模式 uml C++
行为型 迭代器模式
行为型 迭代器模式
45 0
|
设计模式 存储 算法
设计模式~迭代器模式(Iterator)-20
迭代器模式(Iterator Pattern)是Java和.Net编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。迭代器模式已经被淘汰,java中已经把迭代器运用到各个聚集类(collection)中了,使用java自带的迭代器就已经满足我们的需求了 目录 迭代器模式(Iterator) (1)优点 (2)缺点 (3)使用场景 (4)注意事项 (5)应用实例: 代码
59 0
|
设计模式 存储 Java
迭代器模式
迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种顺序访问聚合对象中每个元素的方法,而不暴露其内部实现。
104 1
|
容器
关于迭代器模式我所知道的
关于迭代器模式我所知道的
56 0
|
设计模式 Java 索引
Java设计模式-迭代器模式(Iterator)
Java设计模式-迭代器模式(Iterator)
|
JavaScript 前端开发
简单理解迭代器模式
这几天研究了一下迭代器模式,期间有一段时间经常搞不太懂一些概念与概念之间的关系,今天来整理一下。
131 0
|
设计模式 存储 容器
我学会了,迭代器模式
迭代器模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
104 0
我学会了,迭代器模式
|
Java 容器
迭代器模式
迭代器模式
115 0
|
Java uml 容器
被用到炉火纯清的迭代器模式
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
116 0
被用到炉火纯清的迭代器模式