迭代器模式介紹
定義
提供一種方法訪問一個容器中的元素,而又不暴露該對象的內部細節.
使用場景
遍歷一個聚合對象,但是目前,java中有Collection集合,我們可以直接使用.
優點:
迭代一個對象時候,無需修改源代碼.
類圖體現
-
抽象容器:一個接口,里面有增刪改查的方法名,持有
iterator()
方法.例如java中的Collection接口. - 具體容器:實現抽象容器,實現其中方法,以及重寫iterator方法.例如ArrayList實現List.
-
抽象迭代器:定義遍歷元素所需要的方法,一般有
boolean hasNext()
,Object next()
方法. - 具體迭代器:實現迭代器中的方法.
代碼實現(仿照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<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的另一種理解.