说起遍历,我立马就想到for循环,增强for循环,foreach循环这类的循环遍历,这个不错,既然有这么方便的遍历,为什么我们还要学习Iterator这样的遍历呢?

一个重要的理由是:引入Iterator后可以将遍历和实现分离开来

此话怎讲?什么意思呢?

来说明这样的一个场景:

刚开始写程序时,我们用的是Array,我们自定义的时候指定大小,然后用for循环进行遍历的如火如荼,突然有一天,要求变了,数组大小可变,并且要求使用ArrayList来定义这个集合,那么是不是所有的原来定义为Array的集合都需要改变,并改变其遍历方式啊?这样是不是很麻烦了!

那么问题来了,有没有一种方法或者模式,将遍历和实现分开呢?上面的遍历和实现是耦合在一块的,通过for循环来实现遍历,将for循环绑定到遍历上,如果for循环没法实现了(比如上面,Array被ArrayList代替了,那么for循环的长度由length变为size()了),那么遍历就泡汤了。呵呵,当然有这种方法了,那就是Iterator方式了。

怎么把这遍历和实现分离开呢?请看下文详细分解

这里有四个角色,分别是Iterator,CustomeIterator,Aggregate,CustomeAggregate;四个角色,这四个角色对应的不同的用处,具体如下:

Itertor:这个角色是个接口,用来定义顺序逐个遍历元素的API,包含hasNext和next两个方法。

CustomeIterator:这个是实现Iterator的具体类,用来处理实际上的工作,包含了遍历集合必须的信息(需要遍历的集合以及集合对应的下标)

Aggregate:定义创建Iterator的接口API,

CustomeIterator:实现Aggregate接口并制定Iterator实现的具体类CustomeIterator,并将自己指定为CustimeIterator需要的集合

其类图如下所示:

下面是测试案例

1,java util 的Iterator类,这个来自于java.util.Iterator,

2,自定义的BookShelfIterator类

package ModelItertor;

import java.util.Iterator;

public class BookShelfIterator implements Iterator {
private int index;
private BookShelf bookShelf; public BookShelfIterator(BookShelf bookShelf){
this.bookShelf = bookShelf;
this.index = 0;
} public boolean hasNext() {
return index<this.bookShelf.getLength();
} public Object next() {
Book book = this.bookShelf.getBookAt(index);
index++;
return book;
} }

3,Aggregate类

package ModelItertor;
import java.util.Iterator; public interface Aggregate {
public abstract Iterator iterator();
}

Aggregate

4,自定义的BookShelf类

package ModelItertor;

import java.util.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 i){
if(i>=books.length){
return books[books.length-1];
}
else{
return books[i];
}
} public void appendBook(Book book){
books[last] = book;
last++;
} public int getLength(){
return this.last;
} public Iterator iterator() {
return new BookShelfIterator(this);
} }

5,测试的main类

package ModelItertor;
import java.util.Iterator;
public class Main { public static void main(String[] args) {
BookShelf bookShelf = new BookShelf(4);
bookShelf.appendBook(new Book("A"));
bookShelf.appendBook(new Book("B"));
bookShelf.appendBook(new Book("C"));
bookShelf.appendBook(new Book("D"));
Iterator it = bookShelf.iterator();
while(it.hasNext()){
Book book = (Book)it.next();
System.out.println(book.getName());
}
} }

Main

最终结果

A
B
C
D

那么,还是最上面的问题,为什么搞这么复杂呢?

现在有这样的一个需求,书的数量是可变的,也就是集合由以前的Array变为ArrayList,那么,我们只需要修改一下CustomeAggrator类的实现规则即可,对Iterator的类根本不用做任何改变,改变后的BookShelf类如下

package ModelItertor;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; public class BookShelfList implements Aggregate { private List bookList; public BookShelfList(int size){
this.bookList = new ArrayList(size);
} public Book GetBookAt(int i){
return (Book) bookList.get(i);
} public Iterator iterator() {
return new BookShelfListIterator(this);
} public int getLength(){
return bookList.size();
} public void appendBook(Book book){
bookList.add(book);
}
}

测试main方法如下

package ModelItertor;
import java.util.Iterator;
public class Main { public static void main(String[] args) {
BookShelfList booklist = new BookShelfList(2);
booklist.appendBook(new Book("E"));
booklist.appendBook(new Book("F"));
booklist.appendBook(new Book("G"));
booklist.appendBook(new Book("H")); Iterator it2 = booklist.iterator();
while(it2.hasNext()){
Book book = (Book)it2.next();
System.out.println(book.getName());
}
} }

Iterator模式----一个一个遍历的更多相关文章

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

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

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

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

  3. 290.单词模式。给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式。(c++方法)

    题目描述: 给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式. 这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之 ...

  4. python excel操作 练习-#操作单列 #操作A到C列 #操作1到3行 #指定一个范围遍历所有行和列 #获取所有行 #获取所有列

    ##操作单列#操作A到C列#操作1到3行#指定一个范围遍历所有行和列#获取所有行#获取所有列 #coding=utf-8 from openpyxl import Workbook wb=Workbo ...

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

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

  6. 设计模式之Iterator模式

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

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

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

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

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

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

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

随机推荐

  1. div与table区别

    1:速度和加载方式方面的区别 div 和 table 的差异不是速度,而是加载方式,速度只能是指网络速度,如果速度足够快,是没有差异的: div 的加载方式是即读即加载,遇到 <div> ...

  2. 集合框架(06)Arrays

    Arrays Arrays:用于操作数组的工具类,里面都是静态方法 ---数组变集合 1.asList:将数组变成List集合 把数组变成list集合的好处?可以使用集合的思想和方法来操作数组中的元素 ...

  3. 每天一个liunx命令2之rz和sz命令

    1安装命令工具包     yum install lrzsz   2sz命令发送文件到本地(send): sz filename 3rz命令本地上传文件到服务器(receive): rz 执行该命令后 ...

  4. Ubuntu 16.04通过网络配置工具NetworkManager设置IP、网关、DNS和查看IP、网关、DNS

    说明: 1.NetworkManager工具是Ubuntu桌面版的GUI设置工具. 2.这个工具推荐直接在GUI上操作,不建议用命令行进行管理,比如Wifi这些配置等. 3.当然,这个工具能带有命令行 ...

  5. linux的dd命令详解

    一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 块大小可以使用的计量表 参数注释: 1. if=文件名:输入文件名,缺省为标准输入stdin.即指定源文件.< ...

  6. 向git库提交代码出现”There are no staged files"怎么办?

    1.选择菜单“Window”->"Preference" 2.左边树菜单选择“Team”->"Git"->"Committing&q ...

  7. eclipse 内存配置

    -server -Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=256m -XX:+UseG1GC

  8. 【VAB】获取库文件地址

    如何获取Excle库文件地址呢?具体代码如下: Public Sub 获取Excel库文件夹的路径() MsgBox "库文件夹的路径是: " & Application. ...

  9. Effective JAVA 创建和销毁对象 遇到多参构造器考虑使用构建器

    //构建器抽象类,为不同类的实现提供 public interface Builder<T> { public T build(); } /** * @描述: 营养表 */ public ...

  10. Catch That Cow(广度优先搜索_bfs)

     Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 48036   Accepted: 150 ...