迭代器模式 有更新!

  |   0 评论   |   344 浏览

迭代器模式

什么是迭代器模式?

让用户通过特定的接口访问容器的数据,不需要了解容器内部的数据结构。迭代器模式可以控制外部访问容器内部数据的顺序。

容器实现Iterable接口,致力于提供符合Iterator实现的数据格式。需要遍历容器数据的方法则是使用Iterator提供的数据遍历方法进行数据访问,这样我们处理容器数据的逻辑就和容器本身的实现解耦了,因为我们只需要使用Iterator接口就行了,只要使用的容器提供Iterator对象,我们完全不用关心容器怎么实现,底层数据如何访问之类的问题。而且更换容器的时候也不需要修改数据处理逻辑。

为什么不让容器直接继承Iterator接口,Iterable接口会不会有一种多此一举的感觉?

为了让数据处理逻辑和容器内部数据管理进行分离,提供容器内数据安全性。假设容器实现了Iterator接口,那么我们所有通过Iterator接口进行的数据访问修改操作都会直接影响容器内的数据,因为我们访问的数据和容器维护的数据是同一份数据。其实这样做是很不安全的,因为你也不知道用户访问这个数据会做什么操作,那不如让Iterator接口访问数据副本来的安全。这样大家各管各的,互不影响

自己实现容器

package com.swjsj.design.pattern;

import java.util.Iterator;
import java.util.Spliterator;
import java.util.function.Consumer;

public class MyContainer<E> implements Iterable<E> {


    private Object[] eles;

    public MyContainer(Object[] eles) {
        this.eles = eles;
    }

    @Override
    public Iterator<E> iterator() {
        return new Itr();
    }

    @Override
    public void forEach(Consumer<? super E> action) {

    }

    @Override
    public Spliterator<E> spliterator() {
        return null;
    }


    public class Itr implements Iterator<E> {

        private int position = -1;

        private Object[] data = eles;

        @Override
        public boolean hasNext() {
            return ++position < data.length;
        }

        @Override
        public E next() {
            return (E) data[position];
        }
    }
}

测试迭代器


package com.swjsj.design.pattern;

import java.util.Iterator;

public class IterateWithIterator<E> {


    public static void main(String[] args) {
        MyContainer myContainer = new MyContainer<String>(new String[]{"1ss", "2s", "3s", "4s", "44s", "6s"});

        Iterator iterator = myContainer.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }


    }


}

评论

发表评论

validate