標籤:職責 code name des 迭代器模式 bsp 介面 方式 self
說明:
集合是用來管理和組織資料對象的資料結構的。集合有兩項基本職能:一、批量的儲存資料對象,二、在不暴露集合內部結構的條件下向外界提供訪問內部元素的介面(可能存在的遍曆方式:順序、逆序遍曆,二叉樹的廣度優先,先序後序中序遍曆等)。要使得集合保持整潔和優雅,而不是說令集合內部包含著各種遍曆的方法。因此要求將遍曆的方法從集合的指責中分離出來,按照不同的遍曆需求分別封裝成一個個專門遍曆集合內部資料的迭代器。這種思想可以最大限度的減少彼此之間的耦合程度,從而建立一個鬆散耦合的對象網路。職責分離的要點就是要對分離的職責進行封裝,並以抽象對象的方式建立彼此之間的關係。
迭代器模式:提供一種方法順序訪問一個彙總對象中各個元素,且不用暴露該對象的內部表示
彙總對象的兩個職責: 儲存資料,彙總對象的基本職責 遍曆資料,既是可變化的,又是可分離的。將遍曆資料的行為從彙總對象中分離出來,封裝在迭代器對象中。由迭代器來提供遍曆彙總對象內部資料的行為,簡化彙總對象的設計,更符合單一職責原則。
迭代器模式包含以下4個角色:
Iterator(抽象迭代器) ConcreteIterator(具體迭代器) Aggregate(抽象彙總類) ConcreteAggregate(具體彙總類)
執行個體:
#迭代器抽象類別class Iterator(object): def First(self): pass def Next(self): pass def Isdone(self): pass def CurrItem(self): pass#聚集抽象類別class Aggregate(object): def CreateIterator(self): pass#具體迭代器類class ConcreteIterator(Iterator): def __init__(self, aggregate): self.aggregate = aggregate self.curr = 0 def First(self): return self.aggregate[0] def Next(self): ret = None self.curr += 1 if self.curr < len(self.aggregate): ret = self.aggregate[self.curr] return ret def Isdone(self): return True if self.curr+1 >= len(self.aggregate) else False def CurrItem(self): return self.aggregate[self.curr]#具體聚集類class ConcreteAggregate(Aggregate): def __init__(self): self.ilist = [] def CreateIterator(self): return ConcreteIterator(self)class ConcreteIteratorDesc(Iterator): def __init__(self, aggregate): self.aggregate = aggregate self.curr = len(aggregate)-1 def First(self): return self.aggregate[-1] def Next(self): ret = None self.curr -= 1 if self.curr >= 0: ret = self.aggregate[self.curr] return ret def Isdone(self): return True if self.curr-1<0 else False def CurrItem(self): return self.aggregate[self.curr]if __name__=="__main__": ca = ConcreteAggregate() ca.ilist.append("大鳥") ca.ilist.append("小菜") ca.ilist.append("老外") ca.ilist.append("小偷") itor = ConcreteIterator(ca.ilist) print(itor.First()) while not itor.Isdone(): print(itor.Next()) print("————倒序————") itordesc = ConcreteIteratorDesc(ca.ilist) print(itordesc.First()) while not itordesc.Isdone(): print(itordesc.Next())
#源碼出處http://www.cnblogs.com/onepiece-andy/p/python-iterator-pattern.html
列印結果:
大鳥
小菜
老外
小偷
————倒序————
小偷
老外
小菜
大鳥
模式優點
支援以不同的方式遍曆一個彙總對象,在同一個彙總對象上可以定義多種遍曆方式 簡化了彙總類 由於引入了抽象層,增加新的彙總類和迭代器類都很方便,無須修改原有代碼,符合開閉原則
模式缺點
在增加新的彙總類時需要對應地增加新的迭代器類,類的個數成對增加,這在一定程度上增加了系統的複雜性 抽象迭代器的設計難度較大,需要充分考慮到系統將來的擴充。在自訂迭代器時,建立一個考慮全面的抽象迭代器並不是一件很容易的事情
模式適用環境
訪問一個彙總對象的內容而無須暴露它的內部表示 需要為一個彙總對象提供多種遍曆方式 為遍曆不同的彙總結構提供一個統一的介面,在該介面的實作類別中為不同的彙總結構提供不同的遍曆方式,而用戶端可以一致性地操作該介面
python-迭代器模式