23设计模式之迭代器模式(Iterator)
2015-09-19 22:57
225 查看
返回首页
一、概述
Iterator属于行为型模式中的一种,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。二、适用性
1. 访问一个聚合对象的内容而无需暴露它的内部表示。2. 支持对聚合对象的多种遍历。
3. 为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)。
三、参与者
1. Iterator:迭代器定义访问和遍历元素的接口。2. ConcreteIterator:具体迭代器实现迭代器接口。对该聚合遍历时跟踪当前位置。
3. Aggregate:聚合定义创建相应迭代器对象的接口。
4. ConcreteAggregate:具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。
四、类图
五、代码实现
1. Iterator:迭代器定义访问和遍历元素的接口。
Iterator.swiftimport Foundation /// 迭代器定义访问和遍历元素的接口 protocol Iterator { /** 下一个*/ func next() ->AnyObject /** 第一个*/ func first() /** 最后一个*/ func last() /** 是否有下一个*/ func hasNext() ->Bool }
2. ConcreteIterator:具体迭代器实现迭代器接口。对该聚合遍历时跟踪当前位置。
IteratorImpl.swiftimport Foundation /// 具体迭代器实现迭代器接口,对该聚合遍历时跟踪当前位置 class IteratorImpl: Iterator { /// 数组 private var list:List /// 位置 private var index:Int init(list:List) { self.index = 0 self.list = list } func first() { self.index = 0 } func last() { self.index = self.list.getSize() } func next() -> AnyObject { let obj:AnyObject = self.list.get(index) self.index += 1 return obj } func hasNext() -> Bool { return self.index < self.list.getSize() } }
3. Aggregate:聚合定义创建相应迭代器对象的接口。
List.swiftimport Foundation /// 聚合定义创建相应迭代器对象的接口 protocol List { func iterator() ->Iterator func get(index:Int) ->AnyObject func getSize() ->Int func add(obj:AnyObject) }
4. ConcreteAggregate:具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。
ListImpl.swiftimport Foundation /// 具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例. class ListImpl: List { /// 数组 private var list:[AnyObject] = [] /// 位置 private var index:Int = 0 /// 长度 private var size:Int = 0 func iterator() ->Iterator { return IteratorImpl(list: self) } func get(index:Int) ->AnyObject { return list[index] } func getSize() ->Int { return size } func add(obj:AnyObject) { list.append(obj) index += 1 size += 1 } }
六、测试
1. 代码
// 迭代器模式 let list:List = ListImpl() list.add("a") list.add("b") list.add("c") //第一种迭代方式 let it = list.iterator(); while (it.hasNext()) { println(it.next()) } println("===========") //第二种迭代方式 for (var i = 0; i < list.getSize(); i++) { println(list.get(i)); }<span style="font-size:14px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
2. 运行结果
ab
c
===========
a
b
c
相关文章推荐
- Linux系统下给VMWare安装Tools
- Thymeleaf Javascript 取值
- Thymeleaf Javascript 取值
- Thymeleaf Javascript 取值
- git的认识
- 认识git
- 2015.09.13 网易游戏在线笔试(运营开发工程师)
- 快捷键之---全局变量的提取
- java集合框架之Map
- 强连通分量-kosaraju算法
- FTP学习笔记
- linux系统简单搭建iSCSI
- BestCoder Round #56 (div.2)(Clarke and problem)
- 打开扩展名为xlsx的时候报错,但是扩展名为xls的时候就可以正常使用
- linux进程通信--信号量
- Android Api Demos登顶之路(七十五)Graphics-->GradientDrawable
- hdu 5455 Fang Fang 坑题
- git 的认识
- HDU 5452 Minimum Cut
- 新浪、万网前系统架构师高俊峰:统一监控报警平台架构设计思路