天天看點

疊代器模式疊代器模式(Iterator Pattern)需要雲伺服器的不要錯過優惠

疊代器模式(Iterator Pattern)

疊代器模式(Iterator Pattern)是 Java 和 .Net 程式設計環境中非常常用的設計模式。這種模式用于順序通路集合對象的元素,不需要知道集合對象的底層表示。

疊代器模式屬于行為型模式。

介紹

  • 意圖

    :提供一種方法順序通路一個聚合對象中各個元素, 而又無須暴露該對象的内部表示。
  • 主要解決

    :不同的方式來周遊整個整合對象。
  • 何時使用

    :周遊一個聚合對象。
  • 如何解決

    :把在元素之間遊走的責任交給疊代器,而不是聚合對象。
  • 關鍵代碼

    :定義接口:hasNext, next。
  • 應用執行個體

    :JAVA 中的 iterator。
  • 優點

1、它支援以不同的方式周遊一個聚合對象。

2、疊代器簡化了聚合類。

3、在同一個聚合上可以有多個周遊。

4、在疊代器模式中,增加新的聚合類和疊代器類都很友善,無須修改原有代碼。

  • 缺點

    :由于疊代器模式将存儲資料和周遊資料的職責分離,增加新的聚合類需要對應增加新的疊代器類,類的個數成對增加,這在一定程度上增加了系統的複雜性。
  • 使用場景

1、通路一個聚合對象的内容而無須暴露它的内部表示。

2、需要為聚合對象提供多種周遊方式。

3、為周遊不同的聚合結構提供一個統一的接口。

  • 注意事項

    :疊代器模式就是分離了集合對象的周遊行為,抽象出一個疊代器類來負責,這樣既可以做到不暴露集合的内部結構,又可讓外部代碼透明地通路集合内部的資料。

實作

我将建立一個叙述導航方法的 Iterator 接口和一個傳回疊代器的 Container 接口。實作了 Container 接口的實體類将負責實作 Iterator 接口。

Main,我的示範類使用實體類 Repository 來存儲想要的資料,其中資料使用的是泛型,内部是通過數組動态擴容存儲資訊的。

疊代器模式疊代器模式(Iterator Pattern)需要雲伺服器的不要錯過優惠
步驟 1:建立接口。

Iterator.java

package com.dao.pattern.iterator.interfaces;
    
    /**
     * 疊代器接口
     *
     * @author 阿導
     * @version 1.0
     * @fileName com.dao.pattern.iterator.interfaces.Iterator.java
     * @CopyRright (c) 2018-萬物皆導
     * @created 2018-03-28 18:43:00
     */
    public interface Iterator<E> {
    
        /**
         * 是否有下一個節點
         *
         * @author 阿導
         * @time 2018/3/28
         * @CopyRight 萬物皆導
         * @param
         * @return boolean
         */
        boolean hasNext();
    
        /**
         * 擷取下一個節點
         *
         * @author 阿導
         * @time 2018/3/28
         * @CopyRight 萬物皆導
         * @param
         * @return E
         */
        E next();
    }


           

Container.java

package com.dao.pattern.iterator.interfaces;
    
    /**
     * 容器
     *
     * @author 阿導
     * @version 1.0
     * @fileName com.dao.pattern.iterator.interfaces.Container.java
     * @CopyRright (c) 2018-萬物皆導
     * @created 2018-03-28 18:47:00
     */
    public interface Container<E> {
    
        /**
         * 擷取疊代器
         *
         * @author 阿導
         * @time 2018/3/28
         * @CopyRight 萬物皆導
         * @param
         * @return com.dao.pattern.iterator.interfaces.Iterator<E>
         */
        Iterator<E> getIterator();
    }


           
步驟 2:建立實作了 Container 接口的實體類。該類有實作了 Iterator 接口的内部類 RepositoryIterator。

Repository.java

package com.dao.pattern.iterator.core;
    
    import com.dao.pattern.iterator.interfaces.Container;
    import com.dao.pattern.iterator.interfaces.Iterator;
    
    /**
     * 實作容器的接口
     *
     * @author 阿導
     * @version 1.0
     * @fileName com.dao.pattern.iterator.core.Repository.java
     * @CopyRright (c) 2018-萬物皆導
     * @created 2018-03-28 18:50:00
     */
    public class Repository<E> implements Container<E> {
    
        public static final int INIT=0;
    
        /**
         * 目前下标
         */
        private int index;
    
        /**
         * 長度
         */
        private int length;
        /**
         * 元素
         */
        private Object[] es;
    
        /**
         * 構造方法
         *
         * @author 阿導
         * @time 2018/3/29
         * @Co2018/3/29州微财科技有限公司
         * @param
         */
        public Repository() {
            this.index=INIT;
            this.length=INIT;
            this.es=new Object[INIT];
        }
    
        public void add(E e){
            //數組動态擴容
            Object[] esTemp=new Object[++this.length];
            //數組複制
            System.arraycopy(es, 0, esTemp, 0, es.length);
            //指派
            esTemp[es.length]=e;
            //改變引用
            this.es=esTemp;
        }
        /**
         * 擷取疊代器
         *
         * @return com.dao.pattern.iterator.interfaces.Iterator<E>
         * @author 阿導
         * @time 2018/3/28
         * @CopyRight 萬物皆導
         */
        @Override
        public Iterator<E> getIterator() {
            return new RepositoryIterator<E>();
        }
    
    
        class RepositoryIterator<E> implements Iterator<E> {
    
            /**
             * 是否有下一個節點
             *
             * @return boolean
             * @author 阿導
             * @time 2018/3/28
             * @CopyRight 萬物皆導
             */
            @Override
            public boolean hasNext() {
                if(index<length){
                    return true;
                }
                return false;
            }
    
            /**
             * 擷取下一個節點
             *
             * @return E
             * @author 阿導
             * @time 2018/3/28
             * @CopyRight 萬物皆導
             */
            @Override
            public E next() {
                if(hasNext()){
                    return (E) es[index++];
                }
                return null;
            }
        }
    
    
    }


           
步驟 3:使用 Repository 存儲資料并且擷取疊代器,并列印資料。

Main.java

package com.dao.pattern.iterator.main;    
    
    import com.dao.pattern.iterator.core.Repository;
    import com.dao.pattern.iterator.interfaces.Iterator;
    
    /**
     * 主方法入口
     *
     * @author 阿導
     * @version 1.0
     * @fileName com.dao.pattern.iterator.main.Main.java
     * @CopyRright (c) 2018-萬物皆導
     * @created 2018-03-29 09:30:00
     */
    public class Main {
    
        /**
         * 主方法入口
         *
         * @author 阿導
         * @time 2018/3/29
         * @CopyRight 萬物皆導
         * @param args
         * @return void
         */
        public static void main(String[] args){
            Repository<String> repository=new Repository<>();
            repository.add("A");
            repository.add("B");
            repository.add("C");
            repository.add("D");
    
            Iterator<String> iterator = repository.getIterator();
    
            while (iterator.hasNext()){
                System.out.println(iterator.next());
            }
        }
    }


           
步驟 4:驗證輸出。
A
    B
    C
    D
    
    
           

需要雲伺服器的不要錯過優惠

阿裡雲低價購買雲服務,值得一看

繼續閱讀