天天看點

疊代器模式疊代器模式介紹類圖展現代碼實作(仿照ArrayList)疊代器在java中的展現總結

疊代器模式介紹

定義

提供一種方法通路一個容器中的元素,而又不暴露該對象的内部細節.

使用場景

周遊一個聚合對象,但是目前,java中有Collection集合,我們可以直接使用.

優點:

疊代一個對象時候,無需修改源代碼.

類圖展現

  • 抽象容器:一個接口,裡面有增删改查的方法名,持有

    iterator()

    方法.例如java中的Collection接口.
  • 具體容器:實作抽象容器,實作其中方法,以及重寫iterator方法.例如ArrayList實作List.
  • 抽象疊代器:定義周遊元素所需要的方法,一般有

    boolean hasNext()

    ,

    Object next()

    方法.
  • 具體疊代器:實作疊代器中的方法.
疊代器模式疊代器模式介紹類圖展現代碼實作(仿照ArrayList)疊代器在java中的展現總結

代碼實作(仿照ArrayList)

1.定義容器

Collection

,持有抽象疊代器方法

Iterator()

public interface Collection<T> {
    
    void  add(T  t);
    
    void remove(T t);
    
    Iterator<T> iterator();
    
    
}
           

2.定義抽象疊代器

Iterator

,定義疊代方法

public interface Iterator<T> {
    
    boolean hasNext();
    
    T next();
}
           

3.定義疊代器

MyIterator

實作

public  class MyIterator<T> implements Iterator<T> {
    
    private List<T> list=new ArrayList<>();
    
    private int cursor=0;
    
    public MyIterator(ArrayList<T> list) {
        // TODO Auto-generated constructor stub
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        // TODO Auto-generated method stub
        return cursor!=list.size();
    }

    @Override
    public T next() {
        // TODO Auto-generated method stub
        T obj=null;
        if(this.hasNext())
        {
            obj=list.get(cursor++);
        }
        return obj;
    }
    
    
}

           

4.實作具體容器

public class MyArrayList<T> implements Collection<T>{

    public ArrayList<T> list =new ArrayList<>();
    
    @Override
    public void add(T t) {
        // TODO Auto-generated method stub
        list.add(t);
    }

    @Override
    public void remove(T t) {
        // TODO Auto-generated method stub
        list.remove(t);
    }

    @Override
    public Iterator<T> iterator() {
        // TODO Auto-generated method stub
        return new MyIterator<T>(list);
    }
    
    
    

}
           

5.測試類

public class Test {
    public static void main(String[] args) {
        /**
         * 其實,在collection中的
        ArrayList<String> array=new ArrayList<>();
        array.iterator();
        LinkedList<String> linkedList =new LinkedList<>();
        linkedList.iterator();
        HashSet<String> set=new HashSet<>();
        set.iterator();//内 map.keySet().iterator() d的iterator ,沒有實作
        TreeSet<String> set1=new TreeSet<>();
        set1.iterator();*/
        
        
        
        MyArrayList<String> arrayList=new MyArrayList<>();
        arrayList.add("first");
        arrayList.add("second");
        
        Iterator<String> iterator =arrayList.iterator();
        
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

           

測試結果

first
second

           

疊代器在java中的展現

Collection集合架構

疊代器

Iterator

,是結合容器

Collection

來用的

疊代器模式疊代器模式介紹類圖展現代碼實作(仿照ArrayList)疊代器在java中的展現總結

集合中疊代器的實作

如果想要疊代器, 就要根據容器實作相應的疊代器. 例如:

ArrayList<String> array=new ArrayList<>();
        array.iterator();
    
        HashSet<String> set=new HashSet<>();
        set.iterator();//内 map.keySet().iterator() d的iterator ,沒有實作
        

           

其中,ArrayList的疊代器實作在 他自己的内部類,而HashSet并沒有實作自己的疊代器.

public interface List<E> extends Collection<E> {

    int size();

    boolean isEmpty();

    boolean contains(Object o);

    Iterator<E> iterator();

           
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    //内部類疊代器
    private class Itr implements Iterator<E> {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount;

        public boolean hasNext() {
            return cursor != size;
        }

        @SuppressWarnings("unchecked")
        public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }

.....
}

           

總結

疊代器模式,java中,已經有了很好的展現和應用.當涉及到對象的周遊等操作,我們直接把他們放到集合中即可.沒有必要畫蛇添足,浪費資源.

本次學習,有利于了解java語言的設計,加深對java的了解和應用.每一次學習,都有對java的另一種了解.