Iterator英文意思是重复做某件事,中文翻译为迭代器,这个设计模式中主要有Iterator(迭代器),ConcreteIterator(具体的迭代器),Aggergate(集合),ConcreteAggregate(具体的集合)四个角色;下面举一个例子来说明。

  对某个书架上的书进行遍历,并把每本书的书名打印到控制台上。

1,首先创建Aggergate和Iterator接口

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

对于每个实现Aggergate的实现类,都会有一个方法生成自己的迭代器,每个迭代器都会有hasNext和next方法。

2,创建ConcreteIterator和ConcrereAggregate的类

public class Books {
private String name; public Books(String name) {
this.name = name;
} public String getName() {
return this.name;
} }

  

import java.util.ArrayList;

public class BookShelf implements Aggregate {
private ArrayList books; public BookShelf(int initial) {
this.books = new ArrayList(initial);
} @Override
public Iterator iterator() {
return new BookShelfIterator(this);
} public void appendBooks(Books books) {
this.books.add(books);
} public Books getBookAt(int index) {
return (Books) books.get(index);
} public int getLength() {
return books.size();
}
}
 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() {
Books book = bookshelf.getBookAt(index);
index++;
return book;
} }

具体的迭代器使用具体的集合的一个变量作为自己的字段,通过构造函数为具体的集合赋值,具体的集合通过Iterator生成迭代器

3,程序入口

 public class Main {

     public static void main(String[] args) {
BookShelf bookshelf = new BookShelf(4);
bookshelf.appendBooks(new Books("A"));
bookshelf.appendBooks(new Books("B"));
bookshelf.appendBooks(new Books("C"));
bookshelf.appendBooks(new Books("D"));
bookshelf.appendBooks(new Books("E"));
bookshelf.appendBooks(new Books("F"));
bookshelf.appendBooks(new Books("G"));
bookshelf.appendBooks(new Books("H"));
Iterator it = bookshelf.iterator();
while (it.hasNext()) {
Books book = (Books) it.next();
System.out.println(book.getName());
}
} }

Iterator设计模式体现了高聚合低耦合的设计思想,相比传统的循环代码,如果具体的集合中字段的储存方式发生了改变,仅需要对具体的集合那个类进行修改,而具体的迭代器和Main不用修改,一般的循环代码无法做到这一点。

Iterator模式的更多相关文章

  1. 第3月第13天 cpp模版 Iterator模式 proactor

    1.模版除了传参,还可以自动创建.而传指针只是传参而已. template <class TYPE, class FUNCTOR, class ACE_LOCK, typename TIME_P ...

  2. Java 实现迭代器(Iterator)模式

    类图 /** * 自己定义集合接口, 相似java.util.Collection * 用于数据存储 * @author stone * */ public interface ICollection ...

  3. 设计模式之Iterator模式

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

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

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

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

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

  6. 设计模式(一)Iterator模式

    Iterator模式用于在数据集合中按照顺序遍历集合.即迭代器模式. 下面来看一段实现了迭代器模式的示例程序. 这段程序的作用是将书(Book)放置到书架(BookShelf)中,并将书的名字按顺序显 ...

  7. 设计模式C++描述----20.迭代器(Iterator)模式

    一. 举例说明 我们知道,在 STL 里提供 Iterator 来遍历 Vector 或者 List 数据结构. Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个 ...

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

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

  9. Java设计模式之Iterator模式

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

  10. 1、迭代器 Iterator模式 一个一个遍历 行为型设计模式

    1.Iterator模式 迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或者阵列)上遍访的接口,设计人员无需关心容器的内容. I ...

随机推荐

  1. 当spring单元测试需要用到临时表的时候

    需要将整个单元测试的方法交给spring的事务管理器控制. 两种解决方法: 1.加载的spring配置文件中advice要切到需要测试的方法. 2.单元测试类继承AbstractTransaction ...

  2. 干货|微软远程桌面服务蠕虫漏洞(CVE-2019-1182)分析

    2019年8月,微软发布了一套针对远程桌面服务的修复程序,其中包括两个关键的远程执行代码(RCE)漏洞,CVE-2019-1181和CVE-2019-1182.与之前修复的"BlueKeep ...

  3. x264报错No working C compiler found.

    现象: 缺少C++部署包 解决 [root@localhost x264]# yum -y install gcc gcc-c++ kernel-devel [root@localhost x264] ...

  4. oracle (6)---SQL 数据关联查询

    SQL 数据关联查询 Structure Query Language 从多(n)张表查询对应记录信息,必须有至少n-1个关联条件,否则会出现笛卡尔积的情况.1. 等值连接:没有连接关系的数据不会被查 ...

  5. OpenCV2基础操作----直线、矩形、圆、椭圆函数的使用

    opencv2几个画图函数的调用 要用到几个随机变量: int fr = rand()%frame.rows; int fc = rand()%frame.cols; int b = rand()%2 ...

  6. 委托、Action、Func使用

    参考 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syste ...

  7. SQL基础教程(第2版)第4章 数据更新:4-3 数据的更新(UPDATE)

    第4章 数据更新:4-3 数据的更新(UPDATE) ● 使用UPDATE语句可以更改(更新)表中的数据.● 更新部分数据行时可以使用WHERE来指定更新对象的条件.通过WHERE子句指定更新对象的U ...

  8. c语言中%s和%d的区别

    /************************************************************************* > File Name: ptr_both. ...

  9. pywin32获得tkinter的Canvas窗口句柄,并在上面绘图

    上一篇博文获得主窗口句柄使用的是root.frame或者通过子控件调用master.frame方法,但是子控件本身没有frame方法.那么怎么获得子控件的句柄呢?试过了很多办法,想过把Canvas当作 ...

  10. 普通java项目转换为带有Tomcat的动态Web项目

    原文链接:http://blog.csdn.net/l4432321/article/details/52049125 直接项目右键进入Properties配置,点击Project Facets,再点 ...