Java设计模式之迭代器模式
迭代器是針對集合對象而生的,對于集合對象而言,必然涉及到集合元素的添加刪除操作,同時也肯定支持遍歷集合元素的操作,我們此時可以把遍歷操作也放在集合對象中,但這樣的話,集合對象就承擔(dān)太多的責(zé)任了,面向?qū)ο笤O(shè)計原則中有一條是單一職責(zé)原則,所以我們要盡可能地分離這些職責(zé),用不同的類去承擔(dān)不同的職責(zé)。迭代器模式就是用迭代器類來承擔(dān)遍歷集合元素的職責(zé)。分離集合對象的遍歷行為,抽象出一個迭代器類來負責(zé),這樣既可以做到不暴露集合的內(nèi)部結(jié)構(gòu),又可讓外部代碼透明的訪問集合內(nèi)部的數(shù)據(jù)。
迭代器模式的角色構(gòu)成
(1)迭代器角色(Iterator):定義遍歷元素所需要的方法,一般來說會有這么三個方法:取得下一個元素的方法next(),判斷是否遍歷結(jié)束的方法hasNext()),移出當(dāng)前對象的方法remove(),
(2)具體迭代器角色(Concrete Iterator):實現(xiàn)迭代器接口中定義的方法,完成集合的迭代。
(3)容器角色(Aggregate): 一般是一個接口,提供一個iterator()方法,例如java中的Collection接口,List接口,Set接口等
(4)具體容器角色(ConcreteAggregate):就是抽象容器的具體實現(xiàn)類,比如List接口的有序列表實現(xiàn)ArrayList,List接口的鏈表實現(xiàn)LinkList,Set接口的哈希列表的實現(xiàn)HashSet等。
靜態(tài)迭代子和動態(tài)迭代子:
靜態(tài)迭代子由聚集對象創(chuàng)建,并持有聚集對象的一份快照,在產(chǎn)生后這個快照的內(nèi)容就不再變化,客戶端可以繼續(xù)修改原聚集的內(nèi)容,但是迭代子對象不會反映出聚集的新變化;
靜態(tài)迭代子的好處是它的安全性和簡易性,換言之,靜態(tài)迭代子易于實現(xiàn),不容易出現(xiàn)錯誤,但是由于靜態(tài)迭代子將原聚集復(fù)制了一份,因此它的短處是對時間和內(nèi)存資源的消耗;
動態(tài)迭代子與靜態(tài)迭代子完全相反,在迭代子被產(chǎn)生之后,迭代子還保持著對聚集元素的引用,因此,任何對原聚集內(nèi)容的修改都會在迭代子對象上反映出來。
完整的動態(tài)迭代子不容易實現(xiàn),但是簡化的動態(tài)迭代子并不難實現(xiàn)。我們遇到的迭代子就是簡化的動態(tài)迭代子。
“我們相信人人都可以成為一個IT大神,現(xiàn)在開始,選擇一條陽光大道,助你入門,學(xué)習(xí)的路上不再迷茫。這里是北京尚學(xué)堂,初學(xué)者轉(zhuǎn)行到IT行業(yè)的聚集地。"
?為了讓學(xué)習(xí)變得輕松、高效,今天給大家免費分享一套Java教學(xué)資源。幫助大家在成為Java架構(gòu)師的道路上披荊斬棘。需要資料的歡迎加入學(xué)習(xí)交流群:9285,05736
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Java设计模式之迭代器模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python prettytable表格
- 下一篇: Java 即将迎来转折点?