遍历聚合对象中的元素——迭代器模式(二)
2 迭代器模式概述
?????? 在軟件開發中,我們經常需要使用聚合對象來存儲一系列數據。聚合對象擁有兩個職責:一是存儲數據;二是遍歷數據。從依賴性來看,前者是聚合對象的基本職責;而后者既是可變化的,又是可分離的。因此,可以將遍歷數據的行為從聚合對象中分離出來,封裝在一個被稱之為“迭代器”的對象中,由迭代器來提供遍歷聚合對象內部數據的行為,這將簡化聚合對象的設計,更符合“單一職責原則”的要求。
?????? 迭代器模式定義如下:
| 迭代器模式(Iterator Pattern):提供一種方法來訪問聚合對象,而不用暴露這個對象的內部表示,其別名為游標(Cursor)。迭代器模式是一種對象行為型模式。 |
?????? 在迭代器模式結構中包含聚合和迭代器兩個層次結構,考慮到系統的靈活性和可擴展性,在迭代器模式中應用了工廠方法模式,其模式結構如圖3所示:
圖3 迭代器模式結構圖
?????? 在迭代器模式結構圖中包含如下幾個角色:
?????? ● Iterator(抽象迭代器):它定義了訪問和遍歷元素的接口,聲明了用于遍歷數據元素的方法,例如:用于獲取第一個元素的first()方法,用于訪問下一個元素的next()方法,用于判斷是否還有下一個元素的hasNext()方法,用于獲取當前元素的currentItem()方法等,在具體迭代器中將實現這些方法。
?????? ● ConcreteIterator(具體迭代器):它實現了抽象迭代器接口,完成對聚合對象的遍歷,同時在具體迭代器中通過游標來記錄在聚合對象中所處的當前位置,在具體實現時,游標通常是一個表示位置的非負整數。
?????? ● Aggregate(抽象聚合類):它用于存儲和管理元素對象,聲明一個createIterator()方法用于創建一個迭代器對象,充當抽象迭代器工廠角色。
?????? ● ConcreteAggregate(具體聚合類):它實現了在抽象聚合類中聲明的createIterator()方法,該方法返回一個與該具體聚合類對應的具體迭代器ConcreteIterator實例。
?????? 在迭代器模式中,提供了一個外部的迭代器來對聚合對象進行訪問和遍歷,迭代器定義了一個訪問該聚合元素的接口,并且可以跟蹤當前遍歷的元素,了解哪些元素已經遍歷過而哪些沒有。迭代器的引入,將使得對一個復雜聚合對象的操作變得簡單。
?????? 下面我們結合代碼來對迭代器模式的結構進行進一步分析。在迭代器模式中應用了工廠方法模式,抽象迭代器對應于抽象產品角色,具體迭代器對應于具體產品角色,抽象聚合類對應于抽象工廠角色,具體聚合類對應于具體工廠角色。
?????? 在抽象迭代器中聲明了用于遍歷聚合對象中所存儲元素的方法,典型代碼如下所示:
interface Iterator {public void first(); //將游標指向第一個元素public void next(); //將游標指向下一個元素public boolean hasNext(); //判斷是否存在下一個元素public Object currentItem(); //獲取游標指向的當前元素 }?????? 在具體迭代器中將實現抽象迭代器聲明的遍歷數據的方法,如下代碼所示:
class ConcreteIterator implements Iterator {private ConcreteAggregate objects; //維持一個對具體聚合對象的引用,以便于訪問存儲在聚合對象中的數據private int cursor; //定義一個游標,用于記錄當前訪問位置public ConcreteIterator(ConcreteAggregate objects) {this.objects=objects;}public void first() { ...... }public void next() { ...... }public boolean hasNext() { ...... }public Object currentItem() { ...... } }?????? 需要注意的是抽象迭代器接口的設計非常重要,一方面需要充分滿足各種遍歷操作的要求,盡量為各種遍歷方法都提供聲明,另一方面又不能包含太多方法,接口中方法太多將給子類的實現帶來麻煩。因此,可以考慮使用抽象類來設計抽象迭代器,在抽象類中為每一個方法提供一個空的默認實現。如果需要在具體迭代器中為聚合對象增加全新的遍歷操作,則必須修改抽象迭代器和具體迭代器的源代碼,這將違反“開閉原則”,因此在設計時要考慮全面,避免之后修改接口。
?????? 聚合類用于存儲數據并負責創建迭代器對象,最簡單的抽象聚合類代碼如下所示:
interface Aggregate {Iterator createIterator(); }?????? 具體聚合類作為抽象聚合類的子類,一方面負責存儲數據,另一方面實現了在抽象聚合類中聲明的工廠方法createIterator(),用于返回一個與該具體聚合類對應的具體迭代器對象,代碼如下所示:
class ConcreteAggregate implements Aggregate { ...... public Iterator createIterator() {return new ConcreteIterator(this);}...... }?
? |
【作者:劉偉?? http://blog.csdn.net/lovelion】
轉載于:https://www.cnblogs.com/pangblog/p/3263031.html
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的遍历聚合对象中的元素——迭代器模式(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css为网页顶部和底部都加入背景图
- 下一篇: lightoj 1300 边双联通分量+