迭代器模式

迭代器模式可以說(shuō)經(jīng)常在用驼卖,也可以說(shuō)不常用齿梁,他一般用在集合里面的遍歷逞泄。(JDK已經(jīng)幫我們實(shí)現(xiàn)了担租,所以我們經(jīng)常用別人寫(xiě)好的溯香,只是不知道而已)

計(jì)算機(jī)的物理存儲(chǔ)鲫构,只分為2個(gè)類型,隨機(jī)存儲(chǔ)玫坛,順序存儲(chǔ)结笨,JAVA里的集合的典型代表是ArrayList,LinkList,他們的遍歷方式是不同的,如果外部類想要對(duì)他們進(jìn)行遍歷的話湿镀,不同的集合要寫(xiě)不同的算法炕吸,迭代器模式就是解決這個(gè)問(wèn)題(集合你自己去實(shí)現(xiàn)好遍歷,我外部只管調(diào)用你提供方法就好了)

第一步勉痴,手寫(xiě)ArrayList,LinkList源碼實(shí)現(xiàn),首先抽離公共接口為Collection_
public interface Collection_ {
    void add(Object o);
    int size();
}
arraylist 底層是順序存儲(chǔ)赫模,所以用數(shù)組來(lái)存
public class ArrayList_ implements Collection_{
    private Object[] objects = new Object[10];//初始化一個(gè)10個(gè)大小數(shù)組
    private int index=0;//記錄數(shù)組大小,同時(shí)也當(dāng)下標(biāo)使用

    @Override
    public void add(Object o) {
        if(index>=objects.length){
            //如果放置的元素最后一個(gè)時(shí)候蒸矛,那么先擴(kuò)容為2倍
            Object[] newobjects = new Object[objects.length*2];
            System.arraycopy(objects,0,newobjects,0,objects.length);
            objects=newobjects;
        }

        objects[index]=o;
        index++;
    }

    @Override
    public int size() {
        return index;
    }
}
linklist 采用鏈表形式瀑罗,先造一個(gè)Node類來(lái)包裝,也就是所謂的單個(gè)鏈條元素
public class Node {
    private Object object;
    private Node next;

    public Node(Object object) {
        this.object = object;
    }



    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }
}

public class LinkList_ implements Collection_{
    Node head=null;//頭指針
    Node tail=null;//尾指針
    int size=0;
    @Override
    public void add(Object o) {
        Node node= new Node(o);//鏈表需要Node包裹對(duì)象
        if(head==null){
            //如果頭指針沒(méi)用持對(duì)象雏掠,當(dāng)作是空表
            head=node;
            tail=node;
        }
        tail.setNext(node); //舊的尾節(jié)點(diǎn)保存下一個(gè)節(jié)點(diǎn)的信息斩祭,把新節(jié)點(diǎn)加進(jìn)來(lái)
        tail=node;//tail節(jié)點(diǎn)離開(kāi)舊節(jié)點(diǎn),指向新加進(jìn)來(lái)的node
        size++;//長(zhǎng)度增加

    }

    @Override
    public int size() {
        return size;
    }
}
本期主題是迭代器模式乡话,就是要遍歷集合內(nèi)元素摧玫,但是這些集合寫(xiě)法不一樣,不能統(tǒng)一到一個(gè)共同方法绑青,但是可以讓他們都繼承一個(gè)接口诬像,在接口里面他們自己去實(shí)現(xiàn),外面的人只管調(diào)用他們繼承的接口闸婴,不管他們的內(nèi)部是怎么實(shí)現(xiàn)的
//新增接口
public interface Iterator_ {
        boolean hasNext();

        Object next();
}

//調(diào)整接口
public interface Collection_<E> {
    void add(E o);
    int size();

    Iterator_ iterator();
}
修改后array和link
public class ArrayList_ implements Collection_{
    private Object[] objects = new Object[10];//初始化一個(gè)10個(gè)大小數(shù)組
    private int index=0;//記錄數(shù)組大小颅停,同時(shí)也當(dāng)下標(biāo)使用

    @Override
    public void add(Object o) {
        if(index>=objects.length){
            //如果放置的元素最后一個(gè)時(shí)候,那么先擴(kuò)容為2倍
            Object[] newobjects = new Object[objects.length*2];
            System.arraycopy(objects,0,newobjects,0,objects.length);
            objects=newobjects;
        }

        objects[index]=o;
        index++;
    }

    @Override
    public int size() {
        return index;
    }

    @Override
    public Iterator_ iterator() {

        return new ArrayListIterator();
    }

    private class ArrayListIterator implements Iterator_ {
        private int currentindex=0;//當(dāng)前索引
        @Override
        public boolean hasNext() {
            if(currentindex>=index)
            return false;
            return true;
        }

        @Override
        public Object next() {
            Object object = objects[currentindex];
            currentindex++;
            return object;
        }
    }
}



public class MyLinkList implements ZCollection {
    Node head = null;
    Node tail = null;
    private int size=0;
    @Override
    public void add(Object o) {
        Node n=new Node(o);
        if (head == null) {
            head=n;
            tail=n;
        }
        tail.setNext(n);
        tail=n;
        size++;

    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public Iterator_ interator() {
        return new LinkListIterator();
    }

    private class LinkListIterator implements Iterator_ {
        private int currentindex=0;

        @Override
        public boolean hasNext() {
            if (currentindex >= size) {
                return false;
            }
            return true;
        }

        @Override
        public Object next() {
            int offset=0;
            Node check = check(offset, head);
            currentindex++;
            return check;
        }

        private Node check(int offset, Node node) {
            if (offset == currentindex) {
                return node;
            }else{
              return check(++offset,node.getNext());
            }
        }

    }
}
為了更加和jdk 提供的array和link相像掠拳,把Object 對(duì)象統(tǒng)一換成泛型E
public interface Collection_<E> {
    void add(E o);
    int size();
    Iterator_ iterator();
}


public interface Iterator_<E> {
        boolean hasNext();

        E next();
}
public class ArrayList_<E> implements Collection_<E>{
    private E[] objects = (E[]) new Object[10];//初始化一個(gè)10個(gè)大小數(shù)組
    private int index=0;//記錄數(shù)組大小癞揉,同時(shí)也當(dāng)下標(biāo)使用

    @Override
    public void add(E o) {
        if(index>=objects.length){
            //如果放置的元素最后一個(gè)時(shí)候,那么先擴(kuò)容為2倍
            E[] newobjects = (E[]) new Object[objects.length*2];
            System.arraycopy(objects,0,newobjects,0,objects.length);
            objects=newobjects;
        }

        objects[index]=o;
        index++;
    }

    @Override
    public int size() {
        return index;
    }

    @Override
    public Iterator_ iterator() {

        return new ArrayListIterator();
    }

    private class ArrayListIterator<E> implements Iterator_<E> {
        private int currentindex=0;//當(dāng)前索引
        @Override
        public boolean hasNext() {
            if(currentindex>=index)
            return false;
            return true;
        }

        @Override
        public E next() {
            E object = (E) objects[currentindex];
            currentindex++;
            return object;
        }
    }
}

public class LinkList_<E> implements Collection_<E>{
    Node head=null;//頭指針
    Node tail=null;//尾指針
    int size=0;
    @Override
    public void add(E o) {
        Node node= new Node(o);//鏈表需要Node包裹對(duì)象
        if(head==null){
            //如果頭指針沒(méi)用持對(duì)象溺欧,當(dāng)作是空表
            head=node;
            tail=node;
        }
        tail.setNext(node); //舊的尾節(jié)點(diǎn)保存下一個(gè)節(jié)點(diǎn)的信息喊熟,把新節(jié)點(diǎn)加進(jìn)來(lái)
        tail=node;//tail節(jié)點(diǎn)離開(kāi)舊節(jié)點(diǎn),指向新加進(jìn)來(lái)的node
        size++;//長(zhǎng)度增加

    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public Iterator_ iterator() {
        return new LinkListIterator();
    }

    private class LinkListIterator implements Iterator_ {
        private int currentindex=0;
        @Override
        public boolean hasNext() {
            if (currentindex >= size) {
                return false;
            }
            return true;
        }

        @Override
        public Object next() {
            int offset=0;
            Node node = getNode(offset, head);
            return node;
        }

        private Node getNode(int offset, Node node) {
            if (offset == currentindex) {
                //相等說(shuō)明指定的就是要的節(jié)點(diǎn)姐刁,否則前進(jìn)一步去拿下一個(gè)節(jié)點(diǎn)
                return node;
            }else{
                return getNode(++offset,node.getNext());
            }
        }
    }
}

最后場(chǎng)景類驗(yàn)證
public class Client {
    public static void main(String[] args) {
        Collection_<String> mytest=new ArrayList_<>();
        for (int i = 0; i < 5; i++) {
            mytest.add(i+"");
        }

        Iterator_ iterator = mytest.iterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            System.err.println(next);
        }
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芥牌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子聂使,更是在濱河造成了極大的恐慌壁拉,老刑警劉巖谬俄,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異弃理,居然都是意外死亡溃论,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)痘昌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)钥勋,“玉大人,你說(shuō)我怎么就攤上這事辆苔∷憔模” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵驻啤,是天一觀的道長(zhǎng)菲驴。 經(jīng)常有香客問(wèn)我,道長(zhǎng)骑冗,這世上最難降的妖魔是什么谢翎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮沐旨,結(jié)果婚禮上森逮,老公的妹妹穿的比我還像新娘。我一直安慰自己磁携,他們只是感情好褒侧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著谊迄,像睡著了一般闷供。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上统诺,一...
    開(kāi)封第一講書(shū)人閱讀 51,274評(píng)論 1 300
  • 那天歪脏,我揣著相機(jī)與錄音,去河邊找鬼粮呢。 笑死婿失,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的啄寡。 我是一名探鬼主播豪硅,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼挺物!你這毒婦竟也來(lái)了懒浮?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤识藤,失蹤者是張志新(化名)和其女友劉穎砚著,沒(méi)想到半個(gè)月后次伶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稽穆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年冠王,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秧骑。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扣囊,靈堂內(nèi)的尸體忽然破棺而出乎折,到底是詐尸還是另有隱情,我是刑警寧澤侵歇,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布骂澄,位于F島的核電站,受9級(jí)特大地震影響惕虑,放射性物質(zhì)發(fā)生泄漏坟冲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一溃蔫、第九天 我趴在偏房一處隱蔽的房頂上張望健提。 院中可真熱鬧,春花似錦伟叛、人聲如沸私痹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)紊遵。三九已至,卻和暖如春侥蒙,著一層夾襖步出監(jiān)牢的瞬間暗膜,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工鞭衩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留学搜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓论衍,卻偏偏與公主長(zhǎng)得像恒水,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饲齐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354