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. MyBatis 插件使用-简单的分页插件

    目录 1 分页参数的传递 2 实现 Interceptor 接口 2.1 Interceptor 接口说明 2.1 注解说明 2.3 实现分页接口 PageInterceptor 3. 更改配置 4 ...

  2. Spring boot 官网学习笔记 - Auto-configuration(@SpringBootApplication、@EnableAutoConfiguration、@Configuration)

    Spring Boot auto-configuration attempts to automatically configure your Spring application based on ...

  3. thymeleaf 将后端绑定数据直接传递js变量

    根据自我需求,thymeleaf可以直接将后端数据传递给js中进行使用,例如: 1.后端接口数据: @Controllerpublic class TestController { @RequestM ...

  4. FastDfs之TrackerServer的详细配置介绍

    # is this config file disabled # false for enabled # true for disabled disabled=false #当前配置是否不可用fals ...

  5. Flask基础(04)-->相关配置参数

    # 导入Flask from flask import Flask from flask import config # 创建Flask的应用程序 app = Flask(__name__) #=== ...

  6. Shell之Xargs命令

    目录 Shell之Xargs命令 参考 xargs命令简介 xargs命令格式 xargs实例说明 Shell之Xargs命令

  7. MySQL中日期和时间戳互相转换的函数和方法

     时间戳转换成日期 复制代码代码如下: FROM_UNIXTIME 例如: 数据表中 invest_time 存储的是时间戳,如 1429063399 使用 FROM_UNIXTIME 可以把时间戳转 ...

  8. 最清晰的RESTFUL理解

    Restful理解 API(Application Programming Interface),顾名思义:是一组编程接口规范,客户端与服务端通过请求响应进行数据通信.REST(Representat ...

  9. Flume 学习笔记之 Flume NG高可用集群搭建

    Flume NG高可用集群搭建: 架构总图: 架构分配: 角色 Host 端口 agent1 hadoop3 52020 collector1 hadoop1 52020 collector2 had ...

  10. 从 JVM 视角看看 Java 守护线程

    Java 多线程系列第 7 篇. 这篇我们来讲讲线程的另一个特性:守护线程 or 用户线程? 我们先来看看 Thread.setDaemon() 方法的注释,如下所示. Marks this thre ...