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

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

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

  • Aggregate接口,作为自定义集合的顶层接口。
package site.wangxin520.gof.iterator;

/**
 * 定义表示集合的接口,有一个iterator方法,用于返回一个Iterator类
 * @author wangXgnaw
 *
 */
public interface Aggregate {

    /**
     * 集合的获取迭代器方法,用于返回一个迭代器对象
     * @return Iterator 返回一个迭代器对象
     */
    public Iterator iterator();
}
  • Iterator迭代器的顶层父接口
package site.wangxin520.gof.iterator;

/**
 * 这个是迭代器的类,里面有两个方法,hasnext和next
 * @author wangXgnaw
 *
 */
public interface Iterator {

    /**
     * 判断是否有下一个元素,通常使用在while进行遍历
     * @return boolean
     */
    public boolean hasNext();

    /**
     * 返回当前指针指向的元素,并且把指针指向下一个元素
     * @return Object 返回一个对象,集合的单个元素对象
     */
    public Object next();
}
  • BookShelf书架的类,实现了集合的接口
package site.wangxin520.gof.iterator;

import java.util.ArrayList;

/**
 * 用于表示书架用的类,实现了集合的这个接口。 实际在Java中,集合的顶层接口也是同样的方式。
 *
 * @author wangXgnaw
 *
 */
public class BookShelf implements Aggregate {

    /**
     * 集合,用于保存书的
     */
    private ArrayList<Book> list = new ArrayList<Book>();

    /**
     * 获取到书架的大小
     *
     * @return int
     */
    public int size() {
        return list.size();
    }

    /**
     * 往书架里面放书
     * @param book
     */
    public void putBook(Book book) {
        list.add(book);
    }

    /**
     * 根据序号,从书架里面取书
     *
     * @param index
     * @return Book
     */
    public Book getBook(int index) {
        return list.get(index);
    }

    public Iterator iterator() {
        return new BookShelfIterator(this);
    }

}
  • 书架的迭代器实现,这需要自己定义,以实现迭代器接口定义的方法。
package site.wangxin520.gof.iterator;

/**
 * 书架的一个迭代器
 * @author wangXgnaw
 *
 */
public class BookShelfIterator implements Iterator{

    /**
     * 书架属性,用于对迭代器进行操作需要的。
     */
    private BookShelf bookShelf;

    /**
     * 当前指针指向的位置
     */
    private int index=0;

    /**
     * 书架类迭代器的构造函数
     * @param bookShelf
     */
    public BookShelfIterator(BookShelf bookShelf){
        this.bookShelf=bookShelf;
    }

    public boolean hasNext() {
        if(index<bookShelf.size()){
            return true;
        }
        return false;
    }

    public Object next() {
        //获取指定编号的书
        Book book = bookShelf.getBook(index);
        //指针向下移动一个
        index++;
        return book;
    }    

}
  • Book书的实体类
package site.wangxin520.gof.iterator;

/**
 * 书的实体类
 * @author wangXgnaw
 *
 */
public class Book {
    /**
     * 数的名字
     */
    private String bookName;

    /**
     * 书本的构造函数,传入书本的名字。
     * @param name
     */
    public Book(String name){
        this.bookName=name;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

}
  • 测试方法
package site.wangxin520.gof.iterator;

/**
 * 迭代器模式的测试方法
 * @author wangXgnaw
 *
 */
public class IteratorTest {
    public static void main(String[] args) {
        //获得一个书柜
        BookShelf bs=new BookShelf();
        //往书柜里面放书
        bs.putBook(new Book("红楼梦"));
        bs.putBook(new Book("西游记"));
        bs.putBook(new Book("三国演义"));
        bs.putBook(new Book("水浒传"));

        //使用迭代器,依次获取到书柜中书的名字
        Iterator iterator = bs.iterator();
        while (iterator.hasNext()) {
            Book nextBook = (Book) iterator.next();
            String bookName = nextBook.getBookName();
            System.out.println(bookName);
        }
    }
}
  • 最后的结果:

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

  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. 【GOF23设计模式】迭代器模式

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

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

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

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

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

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

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

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

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

  10. 再起航,我的学习笔记之JavaScript设计模式25(迭代器模式)

    迭代器模式 概念介绍 迭代器模式(Iterator): 在不暴露对象内部结构的同时,可以顺序地访问聚合对象内部的元素. 迭代器 程序中的循环是一种利器,循环语句也使我们程序开发更简洁高效,但是有时一遍 ...

随机推荐

  1. questasim仿真控制——breakpoint断点

    在使用questasim或者modelsim仿真时,如果需要控制仿真时间长度,一般在vsim中使用 run xxxxms/us等命令. 但是有时候不好估计仿真多长时间才能得到所有希望观察的结果,这个时 ...

  2. mysql 命令行操作入门(详细讲解版)

    之前分享过多次Mysql主题,今天继续分享mysql命令行入门   1. 那么多mysql客户端工具,为何要分享命令行操作? -快捷.简单.方便 -在没有客户端的情况下怎么办 -如果是mysql未开启 ...

  3. systemd service

    Man page systemd.unit SYSTEMD.UNIT(5) systemd.unit SYSTEMD.UNIT(5) NAME systemd.unit - Unit configur ...

  4. 通过select选项动态异步加载内容

    通过监听select的change事件来异步加载数据. 1:效果图: 选择Good: 选择 Bad: 2:index.html <!DOCTYPE html> <html lang= ...

  5. IE678进入混杂模式

    <!-- 加载公共头部 --> <include file="Public/header" /> 当你在模板页的最上方加注释的说明时,在IE低版本中打开会进 ...

  6. Java系统属性与Preferences API的简单介绍

    系统属性在和Preferences API都是键值对,前者只能当前应用程序中共享数据,而后者可以在用户的各个应用或用户之间共享数据. 系统属性 Java 的系统属性决定了 Java 程序实际运行的环境 ...

  7. html基础复习

    1.标签选择器   div{}   2.类选择器   .one class="one"   3.id选择器(定义+调用)   #one{} id="one"   ...

  8. 在C#中使用忽略大小写的string.Contains方法

    在C#中比较源字符串是否包含目标字符串,我们可以使用以下方法: source.Contains(target) source.IndexOf(target) >= 0; 相对而言 Contain ...

  9. Java开发笔记(四十)日期与字符串的互相转换

    前面介绍了如何通过Date工具获取各个时间数值,但是用户更喜欢形如“2018-11-24 23:04:18”这种结构清晰.简洁明了的字符串,而非啰里八唆依次汇报每个时间单位及其数值的描述.既然日期时间 ...

  10. Java调用.NET 的Web Service服务故障排除

    参考路径:http://blog.sina.com.cn/s/blog_4c925dca01014y3r.html