做色情網(wǎng)站需要多少錢企業(yè)網(wǎng)站建設(shè)案例
一、說明
迭代器模式是一種行為設(shè)計模式,讓你能在不暴露集合底層表現(xiàn)形式(列表、棧和樹等)的情況下遍歷集合中所有的元素。
(一) 解決問題
遍歷聚合對象中的元素,而不需要暴露該對象的內(nèi)部表示
(二) 使用場景
- 需要對聚合對象中元素進行遍歷,并且不想暴露其內(nèi)部結(jié)構(gòu)
- 減少程序中重復(fù)的遍歷代碼時
- 能夠遍歷不同的甚至是無法預(yù)知的數(shù)據(jù)結(jié)構(gòu)時
二、結(jié)構(gòu)
- 迭代器(Iterator)接口聲明了遍歷集合所需的操作:獲取下一個元素、獲取當前位置和重新開始迭代等。
- 具體迭代器(ConcreteIterators)實現(xiàn)遍歷集合的一種特定算法。迭代器對象必須跟蹤自身遍歷的進度。這使得多個迭代器可以相互獨立地遍歷同一集合。
- 集合(Collection)接口聲明一個或多個方法來獲取與集合兼容的迭代器。請注意,返回方法的類型必須被聲明為迭代器接口,因此具體集合可以返回各種不同種類的迭代器。
- 具體集合(ConcreteCollections)會在客戶端請求迭代器時返回一個特定的具體迭代器類實體。你可能會琢磨,剩下的集合代碼在什么地方呢?不用擔(dān)心,它也會在同一個類中。只是這些細節(jié)對于實際模式來說并不重要,所以我們將其省略了而已。
- 客戶端(Client)通過集合和迭代器的接口與兩者進行交互。這樣一來客戶端無需與具體類進行耦合,允許同一客戶端代碼使用各種不同的集合和迭代器??蛻舳送ǔ2粫孕袆?chuàng)建迭代器,而是會從集合中獲取。但在特定情況下,客戶端可以直接創(chuàng)建一個迭代器(例如當客戶端需要自定義特殊迭代器時)。
三、偽代碼
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
迭代器模式例:迭代樹結(jié)構(gòu)對象
"""from collections.abc import Iterable, Iteratorclass TreeNode:"""樹節(jié)點類"""def __init__(self, value):self.value = valueself.children = []def add_child(self, child):self.children.append(child)def __str__(self, level=0):indent = " " * levelresult = f"{indent}{self.value}\n"for child in self.children:result += child.__str__(level + 4)return resultclass Tree(Iterable):"""聚合對象"""def __init__(self, root):self.root = rootdef __iter__(self) -> Iterator:return TreeIterator(self.root)class TreeIterator(Iterator):"""迭代器"""def __init__(self, node):self.stack = [node]def __next__(self):if not self.stack:raise StopIterationnode = self.stack.pop()self.stack.extend(reversed(node.children))return node.valueif __name__ == "__main__":"""ABDECF"""# 構(gòu)建樹形結(jié)構(gòu)root = TreeNode("A")b = TreeNode("B")c = TreeNode("C")d = TreeNode("D")e = TreeNode("E")f = TreeNode("F")root.add_child(b)root.add_child(c)b.add_child(d)b.add_child(e)c.add_child(f)# 遍歷樹形結(jié)構(gòu)tree = Tree(root)for value in tree:print(value)
四、優(yōu)缺點
優(yōu)點
- 簡化了聚合對象的接口:迭代器模式將遍歷集合元素的責(zé)任分離出來,使得聚合對象和迭代器對象的職責(zé)更加清晰,聚合對象只需提供迭代器而無需關(guān)注遍歷邏輯。
- 隱藏了集合的內(nèi)部結(jié)構(gòu):迭代器模式封裝了集合的內(nèi)部實現(xiàn)細節(jié),使得客戶端可以透明地訪問集合元素,而不必關(guān)心集合的具體實現(xiàn)方式。
缺點
- 不適合過于簡單的集合:對于結(jié)構(gòu)簡單、元素數(shù)量少的集合,不如直接遍歷集合來得簡單直接。
【Python筆記】設(shè)計模式-CSDN博客