遍歷聚合物件中的元素 迭代器模式(二)

2021-08-11 17:58:17 字數 2191 閱讀 7971

在軟體開發中,我們經常需要使用聚合物件來儲存一系列資料。聚合物件擁有兩個職責:一是儲存資料

;二是遍歷資料

。從依賴性來看,前者是聚合物件的基本職責;而後者既是可變化的,又是可分離的。因此,可以將遍歷資料的行為從聚合物件中分離出來,封裝在乙個被稱之為「迭代器」的物件中,由迭代器來提供遍歷聚合物件內部資料的行為,這將簡化聚合物件的設計,更符合「單一職責原則」的要求。

迭代器模式定義如下:

迭代器模式(iterator pattern):提供一種方法來訪問聚合物件,而不用暴露這個物件的內部表示,其別名為游標(cursor)。迭代器模式是一種物件行為型模式。

在迭代器模式結構中包含聚合和迭代器兩個層次結構,考慮到系統的靈活性和可擴充套件性,在迭代器模式中應用了工廠方法模式

,其模式結構如圖3所示:

圖3 迭代器模式結構圖

在迭代器模式結構圖中包含如下幾個角色:

● iterator(抽象迭代器):

它定義了訪問和遍歷元素的介面,宣告了用於遍歷資料元素的方法,例如:用於獲取第乙個元素的first()方法,用於訪問下乙個元素的next()方法,用於判斷是否還有下乙個元素的hasnext()方法,用於獲取當前元素的currentitem()方法等,在具體迭代器中將實現這些方法。

● concreteiterator(具體迭代器):

它實現了抽象迭代器介面,完成對聚合物件的遍歷,同時在具體迭代器中通過游標來記錄在聚合物件中所處的當前位置,在具體實現時,游標通常是乙個表示位置的非負整數。

● aggregate(抽象聚合類):

它用於儲存和管理元素物件,宣告乙個createiterator()方法用於建立乙個迭代器物件,充當抽象迭代器工廠角色。

● concreteaggregate(具體聚合類):

它實現了在抽象聚合類中宣告的createiterator()方法,該方法返回乙個與該具體聚合類對應的具體迭代器concreteiterator例項。

在迭代器模式中,提供了乙個外部的迭代器來對聚合物件進行訪問和遍歷,迭代器定義了乙個訪問該聚合元素的介面,並且可以跟蹤當前遍歷的元素,了解哪些元素已經遍歷過而哪些沒有。迭代器的引入,將使得對乙個複雜聚合物件的操作變得簡單。

下面我們結合**來對迭代器模式的結構進行進一步分析。在迭代器模式中應用了工廠方法模式,抽象迭代器對應於抽象產品角色,具體迭代器對應於具體產品角色,抽象聚合類對應於抽象工廠角色,具體聚合類對應於具體工廠角色。

在抽象迭代器中宣告了用於遍歷聚合物件中所儲存元素的方法,典型**如下所示:

inte***ce iterator
在具體迭代器中將實現抽象迭代器宣告的遍歷資料的方法,如下**所示:

class concreteiterator implements iterator   

public void first()

public void next()

public boolean hasnext()

public object currentitem()

}

需要注意的是抽象迭代器介面的設計非常重要,一方面需要充分滿足各種遍歷操作的要求,盡量為各種遍歷方法都提供宣告,另一方面又不能包含太多方法,介面中方法太多將給子類的實現帶來麻煩。因此,可以考慮使用抽象類來設計抽象迭代器,在抽象類中為每乙個方法提供乙個空的預設實現。

如果需要在具體迭代器中為聚合物件增加全新的遍歷操作,則必須修改抽象迭代器和具體迭代器的源**,這將違反「開閉原則」,因此在設計時要考慮全面,避免之後修改介面。

聚合類用於儲存資料並負責建立迭代器物件,最簡單的抽象聚合類**如下所示:

inte***ce aggregate
具體聚合類作為抽象聚合類的子類,一方面負責儲存資料,另一方面實現了在抽象聚合類中宣告的工廠方法

createiterator()

,用於返回乙個與該具體聚合類對應的具體迭代器物件,**如下所示:

class concreteaggregate implements aggregate   

......

}

理解迭代器模式中具體聚合類與具體迭代器類之間存在的依賴關係和關聯關係。

js中的迭代器,可迭代物件

1.1 判斷是否擁有可迭代能力 console.log array.prototype.hasownproperty symbol.iterator console.log set.prototype.hasownproperty symbol.iterator 1.2 手動實現迭代器const c...

php中的iterator迭代器 遍歷

遍歷主要用於遍歷元素的操作,如對陣列中的每乙個元素都要操作,這個情況下我們就可以使用迭代器 inte ce demo 這裡描述了提供給開發者的介面 inte ce demo2 extends demo 這一步是為了隱藏介面的具體實現 class demo3 implements demo 使用者可以...

迭代器訪問容器中的元素

學習了c 中迭代器的相關知識,iterator迭代器它提供了訪問容器中元素的介面。迭代器範圍是由一對迭代器來確定的,兩個迭代器分別指向容器中的首元素和為元素之後的位置,這兩個迭代器通常被稱為begin和end 值得注意的是迭代器end不會指向容器中的任何元素。迭代器使用與指標頗為相似,訪問容器內部的...