Iterator模式用于在数据集合中按照顺序遍历集合。即迭代器模式。

  下面来看一段实现了迭代器模式的示例程序。

  这段程序的作用是将书(Book)放置到书架(BookShelf)中,并将书的名字按顺序显示出来。

  首先写一个Aggregate接口,这个接口是所要遍历的集合的接口。实现了该接口的类将成为一个可以保存多个元素的集合,就像数组一样。

  在Aggregate接口中声明的方法只有一个iterator()方法,该方法会生成一个用于遍历集合的迭代器。

 package BigJunOba.bjtu.Iterator;

 public interface Aggregate {
public abstract Iterator iterator();
}

  接下来写一个Iterator接口。这里声明了两个方法,即判断是否存在下一个元素的hasNext方法,和获取下一个元素的next方法。

 package BigJunOba.bjtu.Iterator;

 public interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
}

  然后写一个Book类。它可以做的事情只有一件,那就是通过getName方法获取书的名字。书的名字是在外部调用Book类的构造函数并初始化Book类时,作为参数传递给Book类的。

package BigJunOba.bjtu.Iterator;

public class Book {

    private String name;

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

  BookShelf类时表示书架的类。由于需要将该类作为集合进行处理,因此它实现了Aggregate接口。此外,还实现了Aggregate接口的iterator方法。

  这里要注意的是iterator方法,该方法会生成并返回BookShelfIterator类的实例作为BookShelf类对应的Iterator。当外部想要遍历书架时,就会调用这个方法。

 package BigJunOba.bjtu.Iterator;

 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 last;
} @Override
public Iterator iterator() {
return new BookShelfIterator(this);
} }

  BookShelfIterator类用于遍历书架。

 package BigJunOba.bjtu.Iterator;

 public class BookShelfIterator implements Iterator {

     private BookShelf bookShelf;
private int index; public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
this.index = 0;
} @Override
public boolean hasNext() {
if (index < bookShelf.getLength()) {
return true;
} else {
return false;
}
} @Override
public Object next() {
Book book = bookShelf.getBookAt(index);
index++;
return book;
} }

  接下来使用Main类来制作一个小书架。

 package BigJunOba.bjtu.Iterator;

 public class Main {
public static void main(String[] args) {
BookShelf bookShelf = new BookShelf(4);
bookShelf.appendBook(new Book("Around the World in 80 Days"));
bookShelf.appendBook(new Book("Bible"));
bookShelf.appendBook(new Book("Cinderella"));
bookShelf.appendBook(new Book("Daddy Long Legs"));
Iterator it = bookShelf.iterator();
while (it.hasNext()) {
Book book = (Book) it.next();
System.out.println(book.getName());
}
}
}

  输出结果如下。

Around the World in 80 Days

Bible

Cinderella

Daddy Long Legs

  示例程序类图和Iterator模式的类图。

  Iterator模式的类图。

设计模式(一)Iterator模式的更多相关文章

  1. 设计模式之Iterator模式

    STL里的iterator就是应用了iterator模式. 一.什么是迭代模式 Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator按顺 ...

  2. Java设计模式之Iterator模式

    分类: [java]2013-07-15 10:58 917人阅读 评论(0) 收藏 举报 所谓Iterator模式,即是Iterator为不同的容器提供一个统一的访问方式.本文以java中的容器为例 ...

  3. 设计模式—迭代器Iterator模式

    什么是迭代器模式? 让用户通过特定的接口访问容器的数据,不需要了解容器内部的数据结构. 首先我们先模仿集合中ArrayList和LinkedList的实现.一个是基于数组的实现.一个是基于链表的实现, ...

  4. 设计模式——迭代器(Iterator)模式

    概述 迭代器模式简单的说(按我目前的理解)就是一个类提供一个对外迭代的接口,方面调用者迭代.这个迭代接口至少包括两个方法:hasNext()--用于判断是否还有下一个,next()--用于取出下一个对 ...

  5. 设计模式之Iterator模式(2)

    这篇文章比较简单,作一个笔记. 模拟Iterator. Iterator接口: package cn.asto.Interator; public interface Iterator { publi ...

  6. 设计模式:Iterator模式

    目的:将数据的存储和数据的查询分开,降低数据的耦合性 继承关系图: 例子: //定义迭代器接口 template<typename T> class Iterator { public: ...

  7. 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)

    原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...

  8. Java设计模式(12)迭代模式(Iterator模式)

    上了这么多年学,我发现一个问题,好象老师都很喜欢点名,甚至点名都成了某些老师的嗜好,一日不点名,就饭吃不香,觉睡不好似的,我就觉得很奇怪,你的课要是讲的好,同学又怎么会不来听课呢,殊不知:“误人子弟, ...

  9. 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)

    设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...

  10. 【设计模式大法】Iterator模式

    Iterator模式 --一个一个遍历 在Java中的for语句中 i++的作用是让 i 的值在每次循环后自增1,这样就可以访问数组中的下一个元素.下下一个元素.再下下一个元素,也就实现了从头至尾逐一 ...

随机推荐

  1. angular6 iframe应用

    问题一. iframe如何自适应屏幕高度 解决思路:通过设置iframe外层父元素高度等于window高度,再相对于父元素定位iframe元素:案例如下: 第一步: 模板文件中使用iframe // ...

  2. 织梦cms列表页获取标签

    <!-- 标签 --> [field:id runphp='yes'] global $cfg_cmspath; $tags = GetTags(@me); $revalue = ''; ...

  3. Python selenium+phantomjs的js动态爬取

    Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mozilla Firefox.Chrome等.Phanto ...

  4. Scala 学习笔记之集合(8) Try和Future

    import util._ import concurrent.ExecutionContext.Implicits.global import concurrent.Future import co ...

  5. Windows中0环与3环通信(常规方式)

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 一.知识点讲解 1. 设备对象 我们在开发窗口程序的时候,消息被封 ...

  6. CSDN VIP如何添加自定义栏目

    几个月前我也开始在csdn上开了博客,一来给自己加几个少的可怜的流量,再者,让公众号的原创文章获得更多的曝光,让有需要的同学看到. 写过csdn博客的同学都知道,默认只有打赏c币功能:也没有专门广告位 ...

  7. A-01 最小二乘法

    目录 最小二乘法 一.最小二乘法--代数法 二.最小二乘法--矩阵法 三.最小二乘法优缺点 3.1 优点 3.2 缺点 更新.更全的<机器学习>的更新网站,更有python.go.数据结构 ...

  8. Huffman树及其编解码

    Huffman树--编解码 介绍:   Huffman树可以根据输入的字符串中某个字符出现的次数来给某个字符设定一个权值,然后可以根据权值的大小给一个给定的字符串编码,或者对一串编码进行解码,可以用于 ...

  9. python程序编译成exe文件

    最近越来越喜欢使用python写工具.使用的时候,发现程序内部成员python安装目录常常不同,如果用bat双击执行,常常需要修改从svn上down下来的bat文件中python.exe的路径.而给策 ...

  10. JVM垃圾回收(下)

    接着上一篇,介绍完了 JVM 中识别需要回收的垃圾对象之后,这一篇我们来说说 JVM 是如何进行垃圾回收. 首先要在这里介绍一下80/20 法则: 约仅有20%的变因操纵着80%的局面.也就是说:所有 ...