迭代器模式介紹
迭代器模式又稱(chēng)為游標(biāo)模式蝎抽。是行為設(shè)計(jì)模式之一。
迭代器模式的定義
它提供一種方法順序訪問(wèn)一個(gè)容器對(duì)象中的各個(gè)元素路克,而又不需要暴露該對(duì)象的內(nèi)部表示樟结。
迭代器模式中的角色
- Iterator(迭代器)
該角色負(fù)責(zé)定義按順序逐個(gè)遍歷元素的接口(API)。一般定義一個(gè)返回Iterator的函數(shù)精算。 - ConcreteIterator(具體的迭代器)
該角色負(fù)責(zé)實(shí)現(xiàn)Iterator所定義的接口瓢宦。 - Aggregate(集合)
該角色負(fù)責(zé)定義創(chuàng)建Iterator的接口(API)。 - ConcreteAggregate(具體的集合)
該角色負(fù)責(zé)實(shí)現(xiàn)Aggregat角色所定義的接口殖妇。
擴(kuò)展思路要點(diǎn)
- 不管實(shí)現(xiàn)如何變化,都可以使用Iterator刁笙。
為什么一定要考慮引入Iterator呢?如果是數(shù)組/集合,直接for循環(huán)語(yǔ)句進(jìn)行遍歷處理不就可以了嗎谦趣?為什么要在集合之外引入Iterator這個(gè)角色呢疲吸?
一個(gè)重要的理由是,引入Iterator后可以將遍歷與實(shí)現(xiàn)分離開(kāi)來(lái)前鹅≌玻可以看下面的代碼。
while(it.hasNext()) { Book book = it.next(); }
這里只使用了Iterator的hasNext方法和next方法舰绘,并沒(méi)有調(diào)用 具體集合的方法蹂喻。也就是說(shuō),這里的while循環(huán)不依賴(lài)具體集合的實(shí)現(xiàn)捂寿。 - 難以理解抽象類(lèi)和接口
很難理解抽象類(lèi)和接口的人常常使用ConcreteAggregate角色和ConcreteIterator角色編程 ,而不使用Aggregate接口和Iterator接口,他們總想使用具體的類(lèi)來(lái)解決所有問(wèn)題口四。(我就是這樣啊G芈B省!)
如果只是用具體的類(lèi)來(lái)解決問(wèn)題驳概,很容易導(dǎo)致類(lèi)之間的強(qiáng)耦合赤嚼,這些類(lèi)也難以作為組件被再次利用。為了弱化類(lèi)之間的耦合顺又,進(jìn)而使得類(lèi)更加容易作為組件被再次利用更卒,我們需要引入抽象類(lèi)和接口。
切記"不要使用具體類(lèi)來(lái)編程稚照,要優(yōu)先使用抽象類(lèi)和接口來(lái)編程"蹂空。 - 容易弄錯(cuò)的下一個(gè)
在Iterator模式的實(shí)現(xiàn)中俯萌,很容易弄錯(cuò)next()。該方法返回的返回值到底是當(dāng)前元素還是下一個(gè)元素上枕?绳瘟?更詳細(xì)的說(shuō),next方法的名字應(yīng)該是下面這樣的:
return CurrentElementAndAdvanceToNextPosition
也就是說(shuō),next方法是"返回當(dāng)前的元素,并指向下一個(gè)元素"姿骏。同理hasNext則表示接下來(lái)是否可以調(diào)用next方法。
Iterator模式類(lèi)圖