1. 程式人生 > 實用技巧 >CSS漸變、文字、表格

CSS漸變、文字、表格

迭代器模式

一、簡介

迭代器模式主要用於對容器的訪問,比如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一個使用陣列,如果沒有迭代器那麼兩者的遍歷方式是不同的,當不同實現的集合更多時我們需要對每種實現的集合單獨進行遍歷這是非常複雜的,有了迭代器之後把不同實現的集合的遍歷統一了。

四、小結

迭代器的用途比較單一:遍歷集合資料,弱化了容器類與遍歷演算法之間的關係。缺點就是類檔案的增加。