Aha!設計模式 88 迭代器模式 4)

2021-09-24 04:33:03 字數 1483 閱讀 3407

**例項

由於迭代器已經是很多語言的標準裝備,所以在實際的開發中,首先應該考慮語言中提供的迭代器,在功能不能滿足需求時,根據語言定義的迭代器介面定義自己的瀏覽器。接下來我們通過python語言的例子,說明幾個迭代器模式的應用。

python語言中已經事先定義了多種容器,例如列表和字典等。這些容器都提供了乙個iter方法用於獲取迭代器。下面使用python語言中的迭代器來實現乙個聚合類,及其子元素的表示功能。

聚合類1內部定義了乙個列表,用於管理下級子元素。聚合類2不包含下級子元素,但是有三個資料成員。這兩個類分別實現了iter方法,其中聚合類1返回了python語言中列表的迭代器,聚合類2不包含下級成員,所以在它的迭代器方法中返回了資料成員的字典。準備好迭代器方法之後,使用者可以使用相同的迭代器方法訪問兩種實現方式完全不同的聚合類。

**中首先準備了聚合類1,然後為其增加了兩個聚合類2型別的子元素。最後呼叫列印方法迭代輸出這個聚合結構的內容。其結果如下:

可以看到聚合類2的資料成員是按照資料成員被定義的順序輸出的。在實際的開發中,有時也會希望資料成員按照另外的順序輸出。這時就需要自己定義迭代器了。

聚合類2的迭代器方法中定義了乙個內嵌的迭代器類,用來調整輸出成員的順序,它的__iter__和__nexe__方法就是python語言中(正向)迭代器的介面。**的輸出結果如下:

上述**是使用迭代器訪問不同資料結構聚合類的例子。也可以使用迭代器的組合來實現不同方式的訪問。例如下面的**使用相同的演算法分別對列表和字典中的數值進行求和:

我們也可以定義另外的迭代器,用於篩選容器中的資料:

通過這個迭代器和已有迭代器的組合,我們就可以在既不改變演算法又不改變資料結構的前提下實現資料的篩選:

上述**選擇列表和字典中數值大於十的資料進行求和。注意觀察一下這段**和前面求和**的區別,看看是不是只差了乙個選擇迭代器?

Aha!設計模式 86 迭代器模式 2)

適用性 為訪問不同構成的聚合物件提供統一的方法。支援以統一的方法實現不同形式的遍歷。歸納成一句話,就是使用迭代器模式可以以一種方式對不同構成的物件實現不同種類的遍歷。結構 參與者 iterator 抽象迭代器類 抽象迭代器定義取得和遍歷元素所需要的介面。類圖中定義的介面只是乙個示例。在實際的應用中,...

設計模式 行為型 4 迭代器模式

1.模式動機 3.模式結構 迭代器模式包含如下角色 將遍歷資料的行為從聚合物件中分離出來,封裝在迭代器物件中 由迭代器來提供遍歷聚合物件內部資料的行為,簡化聚合物件的設計,更符合單一職責原則 抽象迭代器示例 public inte ce iterator 具體迭代器示例 public class c...

設計模式 迭代器模式

迭代器模式是屬於物件行為性的模式。首先是定義 提供一種方法順序訪問乙個聚合物件中各個元素,而又不暴露物件的表示方法。迭代器的結構圖 適用性 1 訪問乙個聚合物件的內容而無需暴露它的內部表示 2 支援聚合物件的多種遍歷 3 為遍歷不同的聚合結構提供乙個統一的介面 支援多型迭代 協作 concretei...