迭代器模式

迭代器模式

一、简介

迭代器模式主要用于对容器的访问,比如Java中的List、Map等。我们知道对容器的访问必然会涉及遍历算法,如果我们将遍历的方法封装到容器中对于容器来说就承担了过多的功能,此时容器类不仅要维护自身内部数据元素还要对外提供遍历接口,而且遍历状态下的存储问题导致不能对同一容器同时进行多个遍历操作。如果我们不提供遍历方法而让使用者自己实现优惠让容器内部细节暴露,此时在访问类和容器体之间插入迭代器就能很好的解决问题。

定义:提供一种方法顺序访问一个容器对象中的各个元素而又不需要暴露该对象内部表示。

二、使用场景

遍历容器对象时。

三、简单实现

这里以遍历数字0-9的一个集合为例来实现迭代器模式

    //迭代器接口
    public interface Iterator{
        boolean hasNext();
        Object next();
    }
   
    public interface Number{
        Iterator iterator();
    }
    //具体迭代器类
    public class ListDataIterator implements Iterator{
        private List<Integer> list=new ArrayList<>();
        private int index;

        public ListDataIterator(List<Integer> list) {
            this.list = list;
        }

        @Override
        public boolean hasNext() {
            return !(index>list.size()-1||list.get(index)==null);
        }

        @Override
        public Object next() {
            return list.get(index++);
        }
    }
    public class ListData implements Number{
        private List<Integer> list=new ArrayList<>();

        public ListData() {
            list.add(0);
            list.add(1);
            list.add(2);
            list.add(3);
            list.add(4);
            list.add(5);
            list.add(6);
            list.add(7);
            list.add(8);
            list.add(9);
        }


        @Override
        public Iterator iterator() {
            return new ListDataIterator(list);
        }
    }
    //具体迭代器类
    public class ArrayDataIterator implements Iterator{
        private int[] array=new int[10];
        private int index;

        public ArrayDataIterator(int[] array) {
            this.array = array;
        }

        @Override
        public boolean hasNext() {
            return !(index>array.length-1);
        }

        @Override
        public Object next() {
            return array[index++];
        }
    }

    public class ArrayData implements Number{
        private int[] array=new int[10];

        public ArrayData() {
            array[0]=0;
            array[1]=1;
            array[2]=2;
            array[3]=3;
            array[4]=4;
            array[5]=5;
            array[6]=6;
            array[7]=7;
            array[8]=8;
            array[9]=9;
        }


        @Override
        public Iterator iterator() {
            return new ArrayDataIterator(array);
        }
    }

    public void Test(){
     ListData listData=new ListData();
     check(listData.iterator());
     ArrayData arrayData=new ArrayData();
     check(arrayData.iterator());
    }

    public void check(Iterator iterator){
        while (iterator.hasNext()){
            Log.i(TAG, "check: "+iterator.next());
        }
    }

我们看到有两个数字集合,一个使用list一个使用数组,如果没有迭代器那么两者的遍历方式是不同的,当不同实现的集合更多时我们需要对每种实现的集合单独进行遍历这是非常复杂的,有了迭代器之后把不同实现的集合的遍历统一了。

四、小结

迭代器的用途比较单一:遍历集合数据,弱化了容器类与遍历算法之间的关系。缺点就是类文件的增加。

posted @ 2020-10-12 19:39  Robin132929  阅读(10)  评论(0编辑  收藏