迭代器模式,就是设计模式中的Iterator模式。Iterate,英文原意是重复,就是重复做某件事情。所以,迭代器的作用就是从头到尾的重复遍历动作,得到数据集合中的一个又一个元素。因此,迭代器模式中肯定会具备两个元素:迭代器和集合。
其实,在我们熟悉的java语言、C语言中,已经把迭代器模式设计在语言中了。我们可以看下Java语言中的迭代器Iterator:
一、迭代器模式概述
我们可以先思考下,如果让我们自己去设计迭代器,你会怎么做?从上面的描述我们可以看到,迭代器的作用是遍历元素,既然是遍历,那就需要用到循环,循环总得有个判断停止条件吧,如果没有元素我们还去遍历什么?因此,我想到的第一个应该具备的方法是判断是否有下一个元素。那当我们判断还有其他元素时,需要干什么,当然是取元素了,那我们需要的第二个方法是获取元素的方法。因此任何迭代器中,这两方法都是必备的,如上图,在Java语言中的迭代器中就存在这两方法:hasNext()和next()。
既然是设计模式,当然有一定的模板供我们参考,我们看下给定的迭代器设计模式类图:
迭代器模式中各角色的作用:
1、Iterator接口类:定义了按顺序逐个遍历元素的方法,包含了两基本方法:hasNext()和next(),跟我们分析的一致。
2、ConcreteIterator类:根据关系类图,它实现了Iterator接口类,那当然需要具体实现那两方法,遍历离不开索引下标index,因此会包含此字段。另外,它包含了ConcreteAggregate类的对象--也就是具体的集合对象。
3、Aggregate接口类:定义创建Iterator的方法--iterator().
4、ConcreteAggregate类:根据关系类图,它实现了Aggregate接口类,那么它就会创建具体的迭代器。
二、迭代器设计模式举例
根据上述的迭代器设计模式类图,下面我们举一例说明。
假设,我们现在有一个书架,书架上放的是书,我们现在要遍历书架上的书。我们自己设计一个迭代器去实现。我们大致的类图结构是这样的:
1、首先需要定义书实体,因为在书架上我们放置的是书。
package com.zhaodf.pattern.iteratorPattern; public class Book { private String bookName; public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } }
2、定义迭代器接口类
package com.zhaodf.pattern.iteratorPattern; public interface Iterator { boolean hasNext(); Object next(); }
3、定义聚合接口类
package com.zhaodf.pattern.iteratorPattern; public interface Aggregate { Iterator iterator(); }
4、定义具体的集合类
package com.zhaodf.pattern.iteratorPattern; public class BookSelf implements Aggregate { //书架上放的是书的集合 private Book[] books; //目的有二:1.当前位置用来放书 2.++后可用来表示书架上有几本书(集合的下标从0开始) private int last = 0; //定义构造函数 public BookSelf(int maxSize){ this.books = new Book[maxSize]; } //获取某位置的书 public Book getBookAt(int index){ return books[index]; } //添加书,每添加一本书,位置向后移一位 public void appendBook(Book book){ books[last] = book; last ++; } //书架上书的本数 public int getLength(){ return last; } //实现创造迭代器的iterator方法 public Iterator iterator() { return new BookSelfIterator(this); } }
5、定义具体的迭代器类
package com.zhaodf.pattern.iteratorPattern; public class BookSelfIterator implements Iterator { //在迭代器实现类中组合了书集合类,用于遍历 private BookSelf bookSelf; //迭代器中用于判断执元素位置指向的下标 private int index; public BookSelfIterator(BookSelf bookSelf){ this.bookSelf = bookSelf; this.index = 0; } public boolean hasNext() { if(index<bookSelf.getLength()){ return true; } return false; } public Object next() { Book book = bookSelf.getBookAt(index); index++; return book; } }
6、测试类
package com.zhaodf.pattern.iteratorPattern; public class TestIteratorPattern { public static void main(String[] args){ //定义书架可放书的本数 BookSelf bookSelf = new BookSelf(4); bookSelf.appendBook(new Book("Spring深度源码解析")); bookSelf.appendBook(new Book("高并发多线程程序设计")); bookSelf.appendBook(new Book("高高效人士的7个习惯")); bookSelf.appendBook(new Book("分布式理论")); Iterator it = bookSelf.iterator(); while(it.hasNext()){ Book book = (Book)it.next(); System.out.println(book.getBookName()); } } }
三、迭代器模式的思考
我们为什么要使用迭代器模式去迭代遍历数据集合,而不直接使用for循环遍历呢?一个重要的理由是,使用Iterator可以将数据集合的遍历过程与实现分离。我们在使用下面代码获取数据集合元素时,没有使用到BookSelf类,换句话说,我们的遍历过程并不依赖于具体的集合数据对象实现,而只使用到了迭代器Iterator的hasNext和next方法。
while(it.hasNext()){ Book book = (Book)it.next(); System.out.println(book.getBookName()); }
当具体的数据集合对象BookSelf发生变化时,只要能正确得到迭代器Iterator(Iterator it = bookSelf.iterator();),我们根本就不需要修改其他代码。设计模式的作用是什么?就是提高类的可复用性,当一个组件类发生变化时,其他组件类不需要改动或者改动可以忽略,这才是我们使用设计模式的目的。
另外一个重要的思想是:我们不要总想着使用具体的实现类来编程,要优先使用抽象类接口来编程。
四、注意事项
我们很可能对next的含义有理解偏差,有人会问,next方法的返回值到底是指向当前元素还是下一个元素呢?其实它真正的含义是:returnCurrentElementAndAdvanceToNextPosition,即返回当前元素,并且指向下一个元素的位置。
相关推荐
内容包括统一建模语言基础知识、面向对象设计原则、设计模式概述、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式、适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、...
详细描述了java设计模式种23种模式,其中包括,创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、...
主要介绍了Java设计模式——迭代器模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本资源包含一个java体系结构(设计模式)的迭代器模式的例题详解,包含全部源代码。需要的朋友可以自行下载!!!!!!!!!!!!!!!!!!!!!
迭代子模式 java中级进阶高级23种设计模式详细介绍+代码详解PPT模板全文共26页,当前为第18页。 责任链模式 java中级进阶高级23种设计模式详细介绍+代码详解PPT模板全文共26页,当前为第19页。 命令模式 java中级...
java之23中常用设计模式详解 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观...
总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模 式、享...
迭代器模式算是一个比较古老的设计模式,其源于对容器的访问,比如Java中的List、Map、数组等,我们知道对容器对象的访问必然会涉及遍历算法,我们可以将遍历的方法封装在容器中,或者不提供遍历方法。如果我们将...
Java设计模式共有23种,分别为:抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式、桥接模式、组合模式、装饰模式、享元模式、代理模式、命令模式、解释器模式、访问者模式、迭代子...
此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...
迭代器有时又称光标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如list或vector)上遍访的接口,设计人员无需关心容器物件的内容,现在呢,各种语言实作Iterator的方式皆不尽同,有些面向对象...
迭代器模式 222 中介者模式 224 备忘录模式 226 观察者模式 230 状态模式 233 空对象模式 236 策略模式★★★★★ 238 模板模式 240 访问者模式 244 设计模式总结★★★★★ 247 二十二、 Java其他总结 248 Java JVM...
此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...
此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...
此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...
C#2.0-迭代器 C#2.0 的新增功能学习 泛型的序列化问题 .NET 2.0 泛型在实际开发中的一次小应用 C#2.0 Singleton 的实现 .Net Framwork 强类型设计实践 通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: ...
它还以迭代的方式重现了各种常用的Android应用和经典Android游戏的开发全过程,既可以以它们为范例进行实战演练,又可以将它们直接应用到实际开发中去。 目录 -------------------------------------------------...
Python迭代器 Python函数 Python数据结构 模块及部分常见模块详解 戏说系列 校花系列 我与校花同桌之间的金钱交易(又名:戏说值传递与引用传递,这还看不懂你来打我) 难忘的经历,我与校花的约会(又名:Java中...