迭代器模式, 我以为这个图仍是很贴切的. 迭代器至关因而电视机的遥控器, 聚合对象至关因而电视机. 电视机中有不少电视频道的集合, 那些电视频道究竟是怎么组合在一块儿的, 咱们并不知道, 也无需知道, 由于遥控器也就是迭代器给咱们提供了遍历电视频道的方法, 咱们只须要调用不一样的迭代器方法便可遍历电视机中全部节目的集合.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