大B:“迭代器模式是一種大家經(jīng)常要用到的模式,在Java的Collections中我們可以經(jīng)常應(yīng)用。”
小A:“嗯!”
大B:“最常見(jiàn)的是下面這種程序結(jié)構(gòu)。”
(Iteratori=Object.hasnext;i.next;)
{
//todosomething;
}
大B:“在用這個(gè)模式的時(shí)候,我們通常就調(diào)用這裡的方法,而不關(guān)心它的內(nèi)部組織過(guò)程,所以讓我們來(lái)看看它的內(nèi)在。”
小A:“喔?”
大B:“我給你講個(gè)例子,這個(gè)例子是我隨便想的,說(shuō)的是一個(gè)山上沒(méi)有任何的樹(shù),現(xiàn)在我們要種植幾棵樹(shù),例如:蘋(píng)果樹(shù)什麼的,然後我要遍歷這些樹(shù),給每顆樹(shù)噴灑不同的農(nóng)藥!在這個(gè)例子中我們可以看到,遍歷樹(shù)的話可以用到迭代器模式!首先我們要做個(gè)迭代器接口。”
小A:“爲(wèi)什麼要抽象出來(lái)一個(gè)接口?”
大B:“這個(gè)你就要先去了解接口的好處!”
packageTreeIterator;
publicinterfaceIterator{
publicbooleanhasNext();
publicObjectnext();
}
大B:“這個(gè)接口我們有2個(gè)方法,hasNext()是否還有下一條數(shù)據(jù),next返回具體的Object這裡也就是樹(shù)。我們先不必要忙著做它的實(shí)現(xiàn)類,我們現(xiàn)在要來(lái)做的是這個(gè)容器。”
小A:“什麼容器?”
大B:“不是Java中容器,與arraylist什麼的無(wú)關(guān)。正所謂樹(shù)的容器是什麼,是山!”
小A:“山?”
大B:“我們想想山應(yīng)該具有什麼呢?還是讓我來(lái)給你講講吧。首先它要有種植樹(shù)的功能,這裡可以看作添加樹(shù)。我們可以想像山的功能是和樹(shù)相互關(guān)聯(lián)的,那麼他們之間是什麼關(guān)係呢,我們給它們一種聚合的關(guān)係,聚合的關(guān)係大家可以參考UML圖,我在這裡給出它的一種程序表現(xiàn)形式。”
packageTreeIterator;
publicclassHall{
Tree[]tree;//這裡可以看作是聚合關(guān)係
privateintindex;//指向Tree[]的標(biāo)籤
publicHall(intmaxNumber){
tree=newTree[maxNumber];
index=0;
}
publicvoidadd(Treetree)
{
this.tree[index]=tree;
index++;
}
publicIteratorconnectIterator()
{
returnnewTreeIterator(this);
}
}
大B:“這裡我們定義的山可以抽象出Hall類來(lái),Tree[]tree可以看作是山和樹(shù)之間的一種聚合關(guān)係。add方法就是添加樹(shù)。問(wèn)題來(lái)了,山和樹(shù)有了關(guān)係,那麼山和迭代器有什麼關(guān)係呢。它們之間肯定有一種關(guān)係。我們有了這個(gè)容器(山),就要把這個(gè)容器來(lái)實(shí)現(xiàn)迭代的方法:hasNext()和Next()。這裡我們可以看出,山和迭代器之間也是一種關(guān)聯(lián)關(guān)係。我們就把它看成是一種聚合關(guān)係(聚合關(guān)係一種特殊的關(guān)聯(lián)關(guān)係)。我們可以通過(guò)一個(gè)connectIterator方法來(lái)鏈接山和迭代器,接下來(lái)我們要去做一個(gè)具體的迭代類,這個(gè)具體的類中間有了hasNext()和Next()的具體實(shí)現(xiàn)方法。”
packageTreeIterator;
publicclassTreeIteratorimplementsIterator{
privateintlast=0;
privateHallhall;
publicTreeIterator(Hallhall){
this.hall=hall;
}
publicbooleanhasNext(){
if(last