设计模式是开发者前辈们给我们后背的一个经验总结。有效的使用设计模式,能够帮助我们编写可复用的类。所谓“可复用”,就是指将类实现为一个组件,当一个组件发生改变时,不需要对其他组件进行修改,或者只需要修改很小一部分即可。

迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。

下面是一段实现了迭代器模式的示例程序,这段程序作用是,将书BOOK放到书架中BookShelf,并且采用迭代器的方式进行遍历,将书名按照顺序显示出来:

  • Aggregate接口,作为自定义集合的顶层接口。
  1. package site.wangxin520.gof.iterator;
  2.  
  3. /**
  4. * 定义表示集合的接口,有一个iterator方法,用于返回一个Iterator类
  5. * @author wangXgnaw
  6. *
  7. */
  8. public interface Aggregate {
  9.  
  10. /**
  11. * 集合的获取迭代器方法,用于返回一个迭代器对象
  12. * @return Iterator 返回一个迭代器对象
  13. */
  14. public Iterator iterator();
  15. }
  • Iterator迭代器的顶层父接口
  1. package site.wangxin520.gof.iterator;
  2.  
  3. /**
  4. * 这个是迭代器的类,里面有两个方法,hasnext和next
  5. * @author wangXgnaw
  6. *
  7. */
  8. public interface Iterator {
  9.  
  10. /**
  11. * 判断是否有下一个元素,通常使用在while进行遍历
  12. * @return boolean
  13. */
  14. public boolean hasNext();
  15.  
  16. /**
  17. * 返回当前指针指向的元素,并且把指针指向下一个元素
  18. * @return Object 返回一个对象,集合的单个元素对象
  19. */
  20. public Object next();
  21. }
  • BookShelf书架的类,实现了集合的接口
  1. package site.wangxin520.gof.iterator;
  2.  
  3. import java.util.ArrayList;
  4.  
  5. /**
  6. * 用于表示书架用的类,实现了集合的这个接口。 实际在Java中,集合的顶层接口也是同样的方式。
  7. *
  8. * @author wangXgnaw
  9. *
  10. */
  11. public class BookShelf implements Aggregate {
  12.  
  13. /**
  14. * 集合,用于保存书的
  15. */
  16. private ArrayList<Book> list = new ArrayList<Book>();
  17.  
  18. /**
  19. * 获取到书架的大小
  20. *
  21. * @return int
  22. */
  23. public int size() {
  24. return list.size();
  25. }
  26.  
  27. /**
  28. * 往书架里面放书
  29. * @param book
  30. */
  31. public void putBook(Book book) {
  32. list.add(book);
  33. }
  34.  
  35. /**
  36. * 根据序号,从书架里面取书
  37. *
  38. * @param index
  39. * @return Book
  40. */
  41. public Book getBook(int index) {
  42. return list.get(index);
  43. }
  44.  
  45. public Iterator iterator() {
  46. return new BookShelfIterator(this);
  47. }
  48.  
  49. }
  • 书架的迭代器实现,这需要自己定义,以实现迭代器接口定义的方法。
  1. package site.wangxin520.gof.iterator;
  2.  
  3. /**
  4. * 书架的一个迭代器
  5. * @author wangXgnaw
  6. *
  7. */
  8. public class BookShelfIterator implements Iterator{
  9.  
  10. /**
  11. * 书架属性,用于对迭代器进行操作需要的。
  12. */
  13. private BookShelf bookShelf;
  14.  
  15. /**
  16. * 当前指针指向的位置
  17. */
  18. private int index=0;
  19.  
  20. /**
  21. * 书架类迭代器的构造函数
  22. * @param bookShelf
  23. */
  24. public BookShelfIterator(BookShelf bookShelf){
  25. this.bookShelf=bookShelf;
  26. }
  27.  
  28. public boolean hasNext() {
  29. if(index<bookShelf.size()){
  30. return true;
  31. }
  32. return false;
  33. }
  34.  
  35. public Object next() {
  36. //获取指定编号的书
  37. Book book = bookShelf.getBook(index);
  38. //指针向下移动一个
  39. index++;
  40. return book;
  41. }
  42.  
  43. }
  • Book书的实体类
  1. package site.wangxin520.gof.iterator;
  2.  
  3. /**
  4. * 书的实体类
  5. * @author wangXgnaw
  6. *
  7. */
  8. public class Book {
  9. /**
  10. * 数的名字
  11. */
  12. private String bookName;
  13.  
  14. /**
  15. * 书本的构造函数,传入书本的名字。
  16. * @param name
  17. */
  18. public Book(String name){
  19. this.bookName=name;
  20. }
  21.  
  22. public String getBookName() {
  23. return bookName;
  24. }
  25.  
  26. public void setBookName(String bookName) {
  27. this.bookName = bookName;
  28. }
  29.  
  30. }
  • 测试方法
  1. package site.wangxin520.gof.iterator;
  2.  
  3. /**
  4. * 迭代器模式的测试方法
  5. * @author wangXgnaw
  6. *
  7. */
  8. public class IteratorTest {
  9. public static void main(String[] args) {
  10. //获得一个书柜
  11. BookShelf bs=new BookShelf();
  12. //往书柜里面放书
  13. bs.putBook(new Book("红楼梦"));
  14. bs.putBook(new Book("西游记"));
  15. bs.putBook(new Book("三国演义"));
  16. bs.putBook(new Book("水浒传"));
  17.  
  18. //使用迭代器,依次获取到书柜中书的名字
  19. Iterator iterator = bs.iterator();
  20. while (iterator.hasNext()) {
  21. Book nextBook = (Book) iterator.next();
  22. String bookName = nextBook.getBookName();
  23. System.out.println(bookName);
  24. }
  25. }
  26. }
  • 最后的结果:

设计模式之——迭代器模式的更多相关文章

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

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

  2. Python进阶:设计模式之迭代器模式

    在软件开发领域中,人们经常会用到这一个概念——“设计模式”(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一本圣经级的书籍<设计模式:可复用面向对象软件的基础 ...

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

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

  4. js设计模式——4.迭代器模式

    js设计模式——4.迭代器模式 代码演示 /*js设计模式——迭代器模式*/ class Iterator { constructor(container) { this.list = contain ...

  5. 实践GoF的设计模式:迭代器模式

    摘要:迭代器模式主要用在访问对象集合的场景,能够向客户端隐藏集合的实现细节. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:迭代器模式>,作者:元闰子. 简介 有时会遇到这 ...

  6. 【GOF23设计模式】迭代器模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_迭代器模式.JDK内置迭代器.内部类迭代器 package com.test.iterator; /** * 自定义的迭代 ...

  7. [设计模式] 16 迭代器模式 Iterator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对迭代器模式是这样说的:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示. 类图和实例: 迭代器模式由以下角 ...

  8. php设计模式之迭代器模式

    今天的PHP设计模式系列的主角是迭代器(Iterator)模式,迭代器模式提供了抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代. 迭代器(Iterator)模式,它在一个很常见的过程上提供了 ...

  9. 设计模式之迭代器模式(Iterator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  10. [设计模式] Iterator - 迭代器模式:由一份奥利奥早餐联想到的设计模式

    Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...

随机推荐

  1. line: 1: Syntax error: word unexpected (expecting ")")

    开发板上运行可执行程序报出错误: line1: 1: Syntax error: word unexpected (expecting ")") 解决思路: 1.编译器的问题 用a ...

  2. Ubuntu 给应用程序添加桌面图标(本文以Eclipse为例)

    这里以Eclipse为例: eclipse是下载的是解压就能用的,但是没有桌面图标就显得很无力了. 自己写了一个eclipse.desktop放到/usr/share/applications/目录下 ...

  3. You-Get 视频下载工具 Python命令行下载工具

    You-Get 是一个命令行工具, 用来下载各大视频网站的视频, 是我目前知道的命令行下载工具中最好的一个, 之前使用过 youtube-dl, 但是 youtube-dl 吧, 下载好的视频是分段的 ...

  4. Python 元祖的操作

    注意:元祖定义后不可修改,单个元祖后面必须加逗号,否则认为是字符串:tuple = ('apple',) 1.定义元祖 tuple = ('apple','banana','grape','orang ...

  5. vim 笔记

    1.替换 :s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vivian/sky/g 替换当前行所有 vivian 为 sky :%s/vivian/sky/(等同于 : ...

  6. android版本号始终为1

    之前用Eclipse里时,版本号是检查是做如下 <manifest xmlns:android="http://schemas.android.com/apk/res/android& ...

  7. 记录一个glibc 导致的段错误以及gdb 移植

    上一篇我有相关关于一个段错误的记录,现在记录当时的段错误具体是在哪里的. // 从 GNU 的官网下载当前在使用的 glibc 的源代码以及最新的 glibc 源代码 // 地址如下: http:// ...

  8. jquery设置radio选中

    <script type="text/javascript"> $(document).ready(function(){ $("input[type=rad ...

  9. html5shiv.js分析-读源码之javascript系列

    xiaolingzi 发表于 2012-05-31 23:42:29 首先,我们先了解一下html5shiv.js是什么. html5shiv.js是一套实现让ie低版本等浏览器支持html5标签的解 ...

  10. C++ 匿名对象初始化新对象

    //c++中匿名对象初始化新对象 #include<iostream> using namespace std; class Point{ public: Point(){ cout &l ...