设计模式之第6章-迭代器模式(Java实现)
设计模式之第6章-迭代器模式(Java实现)
“我已经过时了,就不要讲了吧,现在java自带有迭代器,还有什么好讲的呢?”“虽然已经有了,但是具体细节呢?知道实现机理岂不美哉?”“好吧好吧。”(迭代器闷闷不乐的答应下来。作者吃着小笼包,咂咂嘴道:哼,想偷懒,窗户都没有~)。
迭代器模式之自我介绍
正如你们所见,我目前已经没落了,基本上没人会单独写一个迭代器,除非是产品性质的研发,我的定义如下:Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.意思呢,就是:提供一种方法,访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节。
迭代器是为容器服务的,那么什么又是容器呢?所谓容器就是能容纳对象的所有的类型的统称。例如Collection集合类型、Set类型等等,这些在《Thinking in Java》里面的第Chapter 11里面有所介绍,想要深入了解容器的话还需要看Chapter 17,如果没有记错的话应该是这个,好了,继续,我呢,就是为了解决遍历这些容器而诞生的,当然,这些都是JDK1.0.8时代的事情了,现在jdk中早已有了迭代器的实现,所以呐,我也就是个过时的产物~下面上类图先:

我提供了便利容器的方便性,容器只要管理增减就可以了,需要遍历时交给我。下面具体分析类图:
- Iterator抽象迭代器:抽象迭代器负责定义访问和遍历元素的接口,而且基本上有固定的三个方法:first()获取第一个元素,next()获取下一个元素,isDone()是否访问完了。Java中是hasNext()。
- ConcreteIterator具体迭代器:实现迭代器接口,完成容器元素遍历。
- Aggregate抽象容器:负责提供创建具体的迭代器角色接口。
- ConcreteAggregate具体容器:具体容器实现容器接口定义的方法,创建出容纳迭代器的对象。
迭代器模式之自我分析
缺点么,还真没有,优点如下:
- 支持以不同的方法遍历一个聚合。
- 简化了聚合的接口。
- 在同一个聚合上可以有多个遍历。
迭代器之实现
既然如此的不是很常用,那就直接进行通用代码的实现吧,首先是抽象迭代器:
public interface Iterator{
//遍历下一个元素
public object next();
//是否已经到最后一个元素
public boolean hasNext();
//删除当前指向的元素
public boolean remove();
}
接下来是具体的迭代器实现代码:
public class ConcreteIterator implements Iterator{
private Vector vector = new Vector();
//定义当前游标
public int cursor = 0;
@SuppressWarnings("unchecked")
public ConcreteIterator(Vector vector){
this.vector = vector;
}
//判断是否是最后一个
public boolean hasNext(){
if(this.cursor == this.vector.size()){
return false;
}
else
return true;
}
//返回下一个元素
public Object next(){
Object result = null;
if(this.hasNext()){
result = this.vector.get(this.cursor++);
}
else
result = null;
return result;
}
//删除当前元素
public boolean remove(){
this.vector.remove(this.cursor);
return true;
}
}
然后是抽象容器类:
public interface Aggregate{
//是容器必有的元素增加
public void add(Object object);
//减少元素
public void remove(Object object);
//由迭代器遍历
public Iterator iterator():
}
最后是具体容器的实现类:
public class ConcreteAggregate implements Aggregate{
//容器对象的容器
private Vector vector = new Vector();
//增加一个元素
public void add(Object object){
this.vector.add(object);
}
//减少一个元素
public void remove(Object object){
this.remove(object);
}
//返回迭代对象
public void add(Object object){
return new ConcreteIterator(this.vector);
}
}
以上就是具体的通用方法的实现了。
迭代器模式应用场合
虽然我这种模式不再使用,但是迭代这种容器却是使用的很频繁的,经常编程的你们想必也见到过很多~下面就来介绍一下具体的使用场合,其实我可以用来:
- 访问一个聚合对象的内容而无需暴露它的内部表示。
- 支持对聚合对象的多种遍历。
- 为遍历不同的聚合结构提供一个统一的接口(即:支持多态迭代)。
以上。欲知后式为何物,且听下回分解。
PS:本博客欢迎转发,但请注明博客地址及作者~
博客地址:http://www.cnblogs.com/voidy/
博客新址:http://voidy.net
<。)#)))≦
设计模式之第6章-迭代器模式(Java实现)的更多相关文章
- 设计模式之第7章-外观模式(Java实现)
设计模式之第7章-外观模式(Java实现) “鱼哥,知道怎么把大象装进冰箱里面么?”(作者按:这么简单的问题还想考我,早了几百年吧.)“把大象装进冰箱里,一共需要三步:第一步,把冰箱门打开:第二步,把 ...
- 设计模式之第22章-组合模式(Java实现)
设计模式之第22章-组合模式(Java实现) “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊.”“当然”“没有?”“有啊.别急,一会人就到了.” 组合模式之自我介绍 “请问你是?怎 ...
- 设计模式之第21章-状态模式(Java实现)
设计模式之第21章-状态模式(Java实现) “what are you 干啥了?怎么这么萎靡不振?”“昨晚又是补新番,又是补小笼包,睡得有点晚啊.话说杨过的那个雕兄真是太好了,每天给找蛇胆,又陪练武 ...
- 设计模式之第20章-访问者模式(Java实现)
设计模式之第20章-访问者模式(Java实现) “嘿,你脸好红啊.”“精神焕发.”“怎么又黄了?”“怕冷,涂的,涂的,蜡.”“身上还有酒味,露馅了吧,原来是喝酒喝的啊.”“嘿嘿,让,让你发现了,今天来 ...
- 设计模式之第17章-备忘录模式(Java实现)
设计模式之第17章-备忘录模式(Java实现) 好男人就是我,我就是曾小贤.最近陈赫和张子萱事件闹得那是一个沸沸扬扬.想想曾经每年都有爱情公寓陪伴的我现如今过年没有了爱情公寓总是感觉缺少点什么.不知道 ...
- 设计模式之第16章-代理模式(Java实现)
设计模式之第16章-代理模式(Java实现) “现在朋友圈真是太让人蛋疼了啊.”“怎么说?”“一堆代理,各种卖东西的,看着好烦人.”“哎,删了呗.”“都是朋友,哪里好意思删啊.”“这倒也是...哎,迫 ...
- 设计模式之第14章-命令模式(Java实现)
设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...
- 设计模式之第11章-建造者模式(Java实现)
设计模式之第11章-建造者模式(Java实现) “那个餐厅我也是醉了...”“怎么了?”“上菜顺序啊,竟然先上甜品,然后是冷饮,再然后才是菜什么的,无语死了.”“这个顺序也有人这么点的啊.不过很少就是 ...
- 设计模式之第10章-桥接模式(Java实现)
设计模式之第10章-桥接模式(Java实现) “一入软件深似海,从此早睡是路人.黑夜给了我黑色的眼睛,我却用他去寻找八阿哥.”“怎么了,又来那么多的感慨啊.”“还能有什么啊,老板是说让换个APP做,这 ...
随机推荐
- Mysql数据库学习总结(一)
数据库概念 数据库(Database)是按照数据结构来组织.存储和管理数据,建立在计算机存储设备上的仓库. 简单说,数据库就是存放数据的仓库.和图书馆存放书籍.粮仓存放粮食类似. 数据库分类 分为 关 ...
- linux 链接的使用 创建和删除符号连接
1 . 使用方式 :ln [option] source_file dist_file -f 建立时,将同档案名删除. ...
- ajax请求成功后js刷新当前页,当前页是post查询结果(用post请求进行搜索筛选)的问题
下面的一个ajax操作,原先操作成功会刷新当前页,保证用户看到的数据是最新的,一般情况不会出现问题.$.ajax({ url: url + "/addTeacherAuth", / ...
- linux 命令——41 ps(转)
Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...
- 如何在SAP云平台上使用MongoDB服务
首先按照我这篇文章在SAP云平台上给您的账号分配MongboDB服务:如何在SAP云平台的Cloud Foundry环境下添加新的Service 然后从这个链接下载SAP提供的例子程序. 1. 使用命 ...
- 【BZOJ1059】[ZJOI2007] 矩阵游戏(匈牙利算法)
点此看题面 大致题意: 有一个\(N*N\)的\(01\)矩阵,可以任意交换若干行和若干列,问是否有方案使得左上角到右下角的连线上全是\(1\). 题意转换 首先,让我们来对题意进行一波转化. 如果我 ...
- 文件系统 - Linux 支持的文件系统类型
NAME 文件系统 - Linux 支持的文件系统类型:minix, ext, ext2, xia, msdos, umsdos, vfat, proc, nfs, iso9660, hpfs, sy ...
- Python实现进度条小程序
一.print()参数介绍 1.end:指定打印结束后添加的字符,默认值为换行符 for j in range(3): print('hello world') for i in range(3): ...
- 2018年ElasticSearch6.2.2教程ELK搭建日志采集分析系统(教程详情)
章节一 2018年 ELK课程计划和效果演示1.课程安排和效果演示 简介:课程介绍和主要知识点说明,ES搜索接口演示,部署的ELK项目演示 es: localhost:9200 k ...
- mysql添加、移除服务
sc delete 服务名 路径/bin/mysqld --install 服务名