文档章节

设计模式之迭代器模式(Iterator)

绝艳天纵
 绝艳天纵
发布于 2013/08/23 15:32
字数 1168
阅读 55
收藏 0

1参考文章

参考1:http://topic.csdn.net/u/20080722/16/e7fcffc3-3d54-48f6-9d3a-2cd39073a287.html

参考2:http://www.java63.com/design_pattern/iterator_pattern.html

参考3:http://blog.csdn.net/aaaaaaaa0705/article/details/6282305

问题起源

想找一些关于迭代器next()和hasNext()方法的内容,最后都归宗到迭代器以及设计模式中的迭代器模式。现在记录一下,有空写一篇学习心得。

一、什么是迭代模式

Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator按顺序进行遍历访问的设计模式。

二、不使用迭代模式的应用

在应用Iterator模式之前,首先应该明白Iterator模式用来解决什么问题。或者说,如果不使用Iterator模式,会存在什么问题。

  1. 由容器自己实现顺序遍历。直接在容器类里直接添加顺序遍历方法
  2. 让调用者自己实现遍历。直接暴露数据细节给外部。

三、不使用迭代模式的缺点

以上方法1与方法2都可以实现对遍历,这样有问题呢?

  1. 容器类承担了太多功能:一方面需要提供添加删除等本身应有的功能;一方面还需要提供遍历访问功能。
  2. 往往容器在实现遍历的过程中,需要保存遍历状态,当跟元素的添加删除等功能夹杂在一起,很容易引起混乱和程序运行错误等。

四、使用迭代模式的应用

Iterator模式就是为了有效地处理按顺序进行遍历访问的一种设计模式,简单地说,Iterator模式提供一种有效的方法,可以屏蔽聚集对象集合的容器类的实现细节,而能对容器内包含的对象元素按顺序进行有效的遍历访问。
所以,Iterator模式的应用场景可以归纳为满足以下几个条件:

  1. 访问容器中包含的内部对象
  2. 按顺序访问

五、迭代模式的结构

六、迭代模式的角色和职责

Iterator(迭代器接口):该接口必须定义实现迭代功能的最小定义方法集,比如提供hasNext()和next()方法。
ConcreteIterator(迭代器实现类): 比如BookShelfIterator,迭代器接口Iterator的实现类。可以根据具体情况加以实现。
Aggregate(容器接口):定义基本功能以及提供类似Iterator iterator()的方法。
ConcreteAggregate(容器实现类): 比如BookShelf,容器接口的实现类。必须实现Iterator iterator()方法。

七、迭代模式的优点

  1. 实现功能分离,简化容器接口。让容器只实现本身的基本功能,把迭代功能委让给外部类实现,符合类的设计原则。
  2. 隐藏容器的实现细节。
  3. 为容器或其子容器提供了一个统一接口,一方面方便调用;另一方面使得调用者不必关注迭代器的实现细节。
  4. 可以为容器或其子容器实现不同的迭代方法或多个迭代方法。

八、代码实例

容器接口Aggregate
public interface Aggregate {    
public abstract Iterator iterator();
}
迭代器接口类Iterator
public interface Iterator {    
public abstract boolean hasNext();
public abstract Object next();
}
Book.java
public class Book {    
private String name="";

public Book(String name) {
this.name = name;
}

/**
* 获得书籍名称
* @return String
*/
public String getName() {
return name;
}
}
容器接口实现类BookShelf
/**  
* 书架类
* ConcreateAggregate
*/
public class BookShelf implements Aggregate{
private Book[] books;
private int last = 0;

//构造函数
public BookShelf(int maxSize) {
this.books = new Book[maxSize];
}

//查找书籍
public Book getBookAt(int index) {
return books[index];
}

//添加书籍
public void appendBook(Book book) {
this.books[last] = book;
last++;
}

//获得书架存书的数量
public int getLength() {
return books.length;
}

//获得书架迭代器对象
@Override
public Iterator iterator() {
return new BookShelfIterator(this);
}
}
迭代器接口实现类BookShelfIterator
//ConcreateIterator
public class BookShelfIterator implements Iterator{
private BookShelf bookShelf;
private int index;

public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
this.index = 0;
}

//检查是否还有下一本书
public boolean hasNext() {
if(index < bookShelf.getLength()) {
return true;
}
else {
return false;
}
}
//返回指定位置的书籍
public Object next() {
Book book = bookShelf.getBookAt(index);
index ++;
return book;
}
}
主函数
public class Main {    
public static void main(String[] args) {
//生成一个书架
BookShelf bookShelf = new BookShelf(4);
//向书架添加书籍
bookShelf.appendBook(new Book("周恩来的晚年岁月"));
bookShelf.appendBook(new Book("C++网络编程"));
bookShelf.appendBook(new Book("J2EE网络编程精解"));
bookShelf.appendBook(new Book("Java编程思想"));

//获得书架迭代器
Iterator it = bookShelf.iterator();
while(it.hasNext()) {
Book book = (Book)it.next();
System.out.println(book.getName());
}
}
}

总结

总而言之,迭代器设计模式的总体思想就是“在容器实现类中实现对实体的增删改查操作,而在迭代器实现类中实现遍历操作。”

© 著作权归作者所有

共有 人打赏支持
绝艳天纵
粉丝 5
博文 38
码字总数 47139
作品 0
程序员
私信 提问
设计模式——Java中常用的9种设计模式

Factory Pattern(工厂模式)   将程序中创建对象的操作,单独出来处理,大大提高了系统扩展的柔性,接口的抽象化处理给相互依赖的对象创建提供了最好的抽象模式。 2. Facade Pattern (门面...

utopia1985
2013/06/19
0
0
spring中用到哪些设计模式

1.工厂模式,这个很明显,在各种BeanFactory以及ApplicationContext创建中都用到了; 2.模版模式,这个也很明显,在各种BeanFactory以及ApplicationContext实现中也都用到了; 3.代理模式,在...

鱼煎
2018/11/22
0
0
Mybatis源码解读-设计模式总结

虽然我们都知道有26个设计模式,但是大多停留在概念层面,真实开发中很少遇到,Mybatis源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应用,能够更深入的理解设计模式。 Myba...

技术小能手
2018/08/08
0
0
设计模式笔录(二),设计模式有哪些

本人出道5年,学习、编程、再学习、再编程一路走过,只是在笔和纸留下些脚印,实感惭愧。现开始把自己学习到的心得,实践中的体会,一一贴在互联网上,大家互相学习、探讨,寻找一些技术朋友...

方旭
2011/03/31
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

四、RabbitMQ3.7在CentOS7下的安装

安装依赖 sudo yum install -y gcc gcc-c++ glibc-devel make ncurses-devel openssl-devel autoconf java-1.8.0-openjdk-devel git 创建yum源 vi /etc/yum.repos.d/rabbitmq-erlang.repo [......

XuePeng77
今天
2
0
android 延长Toast的时长

示例:myToast(5000,"hello"); public void myToast(int showTime, String msg) { Toast hello = Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT); new CountDownTimer(......

雨焰
昨天
4
0
浅谈mybatis的日志适配模式

Java开发中经常用到的日志框架有很多,Log4j、Log4j2、slf4j等等,Mybatis定义了一套统一的日志接口供上层使用,并为上述常用的日志框架提供了相应的适配器。有关适配器模式例子可以参考 设计...

算法之名
昨天
13
0
大数据教程(13.6)sqoop使用教程

上一章节,介绍了sqoop数据迁移工具安装以及简单导入实例的相关知识;本篇博客,博主将继续为小伙伴们分享sqoop的使用。 一、sqoop数据导入 (1)、导入关系表到HIVE ./sqoop import --connect...

em_aaron
昨天
3
0
Git cherry-pick 使用总结

应用背景:假设现在有两个分支:dev_01, dev_02. 如果我想把dev_01分支上的某几个commit合并到dev_02分支, 那么怎么办呢? 这就是cherry-pick的工作了。cherry-pick会捡选某些commit, 即把某...

天王盖地虎626
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部