python-迭代器模式

來源:互聯網
上載者:User

標籤:職責   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-迭代器模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.