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