zoukankan      html  css  js  c++  java
  • 迭代器模式

    迭代器模式

    一、简介

    迭代器模式主要用于对容器的访问,比如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一个使用数组,如果没有迭代器那么两者的遍历方式是不同的,当不同实现的集合更多时我们需要对每种实现的集合单独进行遍历这是非常复杂的,有了迭代器之后把不同实现的集合的遍历统一了。

    四、小结

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

  • 相关阅读:
    P1169 [ZJOI2007]棋盘制作[悬线法/二维dp]
    P2279 [HNOI2003]消防局的设立[树形dp]
    Django项目部署
    Python3编译安装以及创建虚拟运行环境
    ASA与N6K对接
    Django使用admin管理后台管理数据库表
    WebStrom配置
    H3C常用配置和命令
    VPC配置介绍
    Linux下编译安装MySQL
  • 原文地址:https://www.cnblogs.com/Robin132929/p/13804795.html
Copyright © 2011-2022 走看看