?這天是周末蹈丸,小明坐著旅行大巴車出去游玩,在大巴車上玻墅,售票員需要收汽車票介牙。這個(gè)售票員其實(shí)在做一件重要的事,就是把車廂里所有的人都遍歷了一遍澳厢,不放過一個(gè)不買票的乘客环础,這也是一個(gè)設(shè)計(jì)模式的體現(xiàn),那就是迭代器模式剩拢。
一线得、什么是迭代器模式?
??提供一種方法順序訪問一個(gè)聚合對(duì)象中各個(gè)元素徐伐,而又不暴露該對(duì)象內(nèi)部表示贯钩。
二、迭代器模式的組成呵晨?
- 迭代器角色(Iterator)
??定義遍歷元素所需要的方法魏保,一般來說會(huì)有這么三個(gè)方法,取得下一個(gè)元素的方法next()摸屠,判斷是否遍歷結(jié)束的方法hashNext()谓罗,移除當(dāng)前對(duì)象的方法remove()。
- 具體迭代器角色(Concrete Iterator)
??實(shí)現(xiàn)迭代器接口中定義的方法季二,完成集合的迭代檩咱。
- 容器角色(Aggregate)
??一般是一個(gè)接口,提供一個(gè)iterator()方法胯舷,例如Java中Collection接口刻蚯,List接口,Set接口等桑嘶。
- 具體容器角色(Concrete Aggregate)
??抽象容器的具體實(shí)現(xiàn)類炊汹,比如List接口中的有序?qū)崿F(xiàn)ArrayList,List接口中的鏈表實(shí)現(xiàn)LinkedList逃顶,Set中的哈希列表的實(shí)現(xiàn)HashSet等讨便。
- 迭代器角色
public interface Iterator {
public boolean hasNext();
public Object next();
}
- 具體迭代器角色
public class ConcreteIterator implements Iterator {
private int index;
private List list = null;
public ConcreteIterator(List list) {
super();
this.list = list;
}
@Override
public boolean hasNext() {
if (index >= list.getSize()) {
return false;
} else {
return true;
}
}
@Override
public Object next() {
Object object = list.get(index);
index++;
return object;
}
}
- 容器角色
public interface List {
public void add(Object obj);
public Object get(int index);
public Iterator iterator();
public int getSize();
}
- 容器角色實(shí)現(xiàn)類
public class ConcreteAggregate implements List {
private Object[] list;
private int size = 0;
private int index = 0;
public ConcreteAggregate(){
index = 0;
size = 0;
list = new Object[100];
}
@Override
public void add(Object obj) {
list[index ++] =obj;
size ++;
}
@Override
public Object get(int index) {
return list[index];
}
@Override
public Iterator iterator() {
return new ConcreteIterator(this);
}
@Override
public int getSize() {
return size;
}
}
- 測(cè)試類
public class IteratorTest {
public static void main(String []args) {
List list = new ConcreteAggregate();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
Iterator it=list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
三充甚、迭代器適用場(chǎng)景
??提供一種方法順序訪問一個(gè)聚合對(duì)象中各個(gè)元素,而不是暴露該對(duì)象內(nèi)部表示霸褒。當(dāng)需要訪問一個(gè)聚集對(duì)象伴找,而且不管這些對(duì)象是什么都需要遍歷的時(shí)候應(yīng)該考慮使用迭代器模式。
- 總結(jié)
??迭代器(Iterator)模式就是分離了集合對(duì)象的遍歷行為废菱,抽象出一個(gè)迭代器來負(fù)責(zé)技矮,這樣既可以做到不暴露集合的內(nèi)部結(jié)構(gòu),又可讓外部代碼透明的訪問集合內(nèi)部的數(shù)據(jù)殊轴。
??看來那個(gè)售票員是了不起的迭代高手衰倦,每次需要統(tǒng)計(jì)人數(shù),然后對(duì)整車的乘客迭代遍歷旁理,不放過任何漏網(wǎng)之魚耿币。
??編程又何嘗不是這樣,我相信代碼沒有最好韧拒,只有更好,我要繼續(xù)努力十性。