疊代器模式介紹
定義
提供一種方法通路一個容器中的元素,而又不暴露該對象的内部細節.
使用場景
周遊一個聚合對象,但是目前,java中有Collection集合,我們可以直接使用.
優點:
疊代一個對象時候,無需修改源代碼.
類圖展現
- 抽象容器:一個接口,裡面有增删改查的方法名,持有
方法.例如java中的Collection接口.iterator()
- 具體容器:實作抽象容器,實作其中方法,以及重寫iterator方法.例如ArrayList實作List.
- 抽象疊代器:定義周遊元素所需要的方法,一般有
,boolean hasNext()
方法.Object next()
- 具體疊代器:實作疊代器中的方法.
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuE2MykzY2QWMhVDOmVTNlNWN0I2NhFmZyM2NiZGNkFWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
代碼實作(仿照ArrayList)
1.定義容器 Collection
,持有抽象疊代器方法 Iterator()
Collection
Iterator()
public interface Collection<T> {
void add(T t);
void remove(T t);
Iterator<T> iterator();
}
2.定義抽象疊代器 Iterator
,定義疊代方法
Iterator
public interface Iterator<T> {
boolean hasNext();
T next();
}
3.定義疊代器 MyIterator
實作
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的另一種了解.