大B:“由於迭代器模式本身的規定比較鬆散,所以具體實現也就五花八門。”
小A:“我們又應該用什麼方法去實現迭代器模式?”
大B:“1、迭代器角色定義了遍曆的接口,但是沒有規定由誰來控製迭代。在Javacollection的應用中,是由客戶程序來控製遍曆的進程,被稱為外部迭代器;還有一種實現方式便是由迭代器自身來控製迭代,被稱為內部迭代器。外部迭代器要比內部迭代器靈活、強大,而且內部迭代器在Java語言環境中,可用性很弱。2、在迭代器模式中沒有規定誰來實現遍曆算法。好像理所當然的要在迭代器角色中實現。因為既便於一個容器上使用不同的遍曆算法,也便於將一種遍曆算法應用於不同的容器。但是這樣就破壞掉了容器的封裝——容器角色就要公開自己的私有屬性,在Java中便意味著向其他類公開了自己的私有屬性。”
大B:“那我們把它放到容器角色裏來實現好了。這樣迭代器角色就被架空為僅僅存放一個遍曆當前位置的功能。但是遍曆算法便和特定的容器緊緊綁在一起了。”
大B:“而在JavaCollection的應用中,提供的具體迭代器角色是定義在容器角色中的內部類。這樣便保護了容器的封裝。但是同時容器也提供了遍曆算法接口,你可以擴展自己的迭代器。好了,我們來看下JavaCollection中的迭代器是怎麼實現的吧。”
//迭代器角色,僅僅定義了遍曆接口
//容器角色,這裏以List為例。它也僅僅是一個接口,就不羅列出來了。
//具體容器角色,便是實現了List接口的ArrayList等類。為了突出重點這裏指羅列和迭代器相關的內容。
//具體迭代器角色,它是以內部類的形式出來的。AbstractList是為了將各個具體容器角色的公共部分提取出來而存在的。
……
//這個便是負責創建具體迭代器角色的工廠方法
//作為內部類的具體迭代器角色
(本章完)