迭代器模式, 我以爲這個圖仍是很貼切的. 迭代器至關因而電視機的遙控器, 聚合對象至關因而電視機. 電視機中有不少電視頻道的集合, 那些電視頻道究竟是怎麼組合在一塊兒的, 咱們並不知道, 也無需知道, 由於遙控器也就是迭代器給咱們提供了遍歷電視頻道的方法, 咱們只須要調用不一樣的迭代器方法便可遍歷電視機中全部節目的集合.java
在軟件開發中, 咱們常常須要使用聚合對象來存儲一系列的數據. 聚合對象有兩個職責: 存儲數據; 遍歷數據. 從依賴性來看, 前者是聚合對象的基本職責; 然後者既是可變的, 也是可分離的. 所以可將遍歷數據的行爲從聚合對象中分離出來, 封裝在一個被稱爲"迭代器"的對象中, 由迭代器來提供遍歷局和對象內部數據的行爲, 這將簡化聚合對象的設計, 更符合"單一職責原則"的要求.算法
迭代器模式: 提供一種方法來訪問聚合對象, 而不用暴露這個對象的內部表示, 其別名爲 遊標. 迭代器模式是一種對象行爲型模式.編程
在迭代器模式中包含聚合和迭代器兩個層次結構, 考慮到系統的靈活性和可擴展性, 在迭代器模式中應用了工廠方法模式, 模式結構圖以下:設計模式
迭代器模式中的幾個角色:app
在迭代器模式中,提供了一個外部的迭代器來對聚合對象進行訪問和遍歷,迭代器定義了一個訪問該聚合元素的接口,而且能夠跟蹤當前遍歷的元素,瞭解哪些元素已經遍歷過而哪些沒有。迭代器的引入,將使得對一個複雜聚合對象的操做變得簡單。編程語言
一個簡單的迭代器模式的Swift實現ide
抽象迭代器 AbsIterator // 抽象迭代器, 用接口來聲明 protocol AbsIterator { func next() func isLast() -> Bool func previous() func isFirst() -> Bool func getNextItem() -> AnyObject func getPreviousItem() -> AnyObject } 具體迭代器 ContreateIterator class ContreateIterator: NSObject, AbsIterator { var productList: ProductList var list: [AnyObject] var cursor1: Int var cursor2: Int init(productList: ProductList) { self.productList = productList list = productList.objects cursor1 = 0 cursor2 = list.count } func next() { cursor1 += 1 } func isLast() -> Bool { return cursor1 == list.count } func previous() { cursor2 -= 1 } func isFirst() -> Bool { return cursor2 == 0 } func getNextItem() -> AnyObject { return list[cursor1] } func getPreviousItem() -> AnyObject { return list[cursor2] } } 抽象聚合類 AbsObjectList class AbsObjectList: NSObject { var objects: [AnyObject] init(objs: [AnyObject]) { objects = objs } func getObjects() -> [AnyObject] { return objects; } func addObject(obj: AnyObject) { objects.append(obj) } func removeObject(obj: AnyObject) { } func createIterator() -> AbsIterator { return Optional.none! } } 具體聚合類 ProductList class ProductList: AbsObjectList { override init(objs: [AnyObject]) { super.init(objs: objs) } override func createIterator() -> AbsIterator { return ContreateIterator(productList: self) } } 客戶端代碼: var array = [String]() array.append("walden") array.append("wei") array.append("shengli") array.append("liuyong") array.append("jinlong") let products = ProductList(objs: array as [AnyObject]) let iterator = products.createIterator() print("\(iterator.getNextItem())")
若是在如上所示代碼中增長新的具體聚合類, 只需增長新的聚合類子類和一個新的具體迭代器類, 原有類庫代碼無需修改, 符合開閉原則; 若是須要更換迭代器, 只須要增長一個新的具體迭代器做爲抽象迭代器的子類, 從新實現遍歷方法, 符合開閉原則; 可是若是要在迭代器中增長新的方法, 則須要修改抽象迭代器源代碼, 這將違背開閉原則.工具
在迭代器模式的結構圖中, 咱們能夠看到具體迭代器類和具體聚合類之間存在雙重關係, 其中一個關係爲關聯關係, 在具體迭代器中須要維持一個隊具體聚合對象的引用, 該關聯關係的目的是訪問存儲在聚合對象中的數據, 以便迭代器可以對這些數據進行遍歷操做. 除了使用關聯關係, 爲了可以讓迭代器能夠訪問到聚合對象中的數據, 咱們能夠將迭代器設計爲聚合類的內部類, 在java的JDK中, 就是經過這種方式實現的..net
迭代器模式是一種使用頻率很是高的設計模式,經過引入迭代器能夠將數據的遍歷功能從聚合對象中分離出來,聚合對象只負責存儲數據,而遍歷數據由迭代器來完成。因爲不少編程語言的類庫都已經實現了迭代器模式,所以在實際開發中,咱們只須要直接使用Java、C#等語言已定義好的迭代器便可,迭代器已經成爲咱們操做聚合對象的基本工具之一。設計
迭代器模式的主要優勢以下:
迭代器模式的主要缺點以下:
在如下狀況下能夠考慮使用迭代器模式:
更多詳情請參考原文:
Reference: http://blog.csdn.net/lovelion/article/details/9992005