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

迭代器模式(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. 实践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. cocos2d-x的win32编译环境

    1>     检查或配置VS 1.1>头文件 [c/c++]->附加包含目录 1.2>依赖库 [链接器]->[输入]->[附加依赖项] 2>     可能出现 ...

  2. vuex中store分文件时候index.js进行文件整合

    import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex); import getters from './getters.js' impo ...

  3. JS学习笔记(3)--json格式数据的添加,删除及排序方法

    这篇文章主要介绍了json格式数据的添加,删除及排序方法,结合实例形式分析了针对一维数组与二维数组的json格式数据进行增加.删除与排序的实现技巧,需要的朋友可以参考下   本文实例讲述了json格式 ...

  4. 一款基于jQuery的图片分组切换焦点图插件

    这是一款基于jQuery的图片切换焦点图插件,这款jQuery焦点图插件的特点是图片可以分组切换,也就是说一次可以切换多张图片,相比其他焦点图插件,它能节省更多的空间,可以向用户展示更多的图片,非常实 ...

  5. 继承log4.net的类

    using System; using System.Diagnostics; [assembly: log4net.Config.XmlConfigurator(Watch = true)] nam ...

  6. 确定文件的位置--浏览文件夹对话框folderBrowserDialog

    private void button1_Click(object sender, EventArgs e) { folderBrowserDialog1.ShowNewFolderButton = ...

  7. Office Web App2013 在线查看PDF文件

    经常会有客户问,在SharePoint中,如何在浏览器中查看与编辑文档,通常给出的解决方案是集成Office Web App. 而在实际应用过程中,客户通常会要求实现PDF文件在线查看,对于PDF文件 ...

  8. php if语句判定my查询是否为空

    <?php header("Content-type: text/html; charset=utf-8"); $username=$_GET['username']; $p ...

  9. 第二百四十七节,Bootstrap按钮和折叠插件

    Bootstrap按钮和折叠插件 学习要点: 1.按钮 2.折叠 本节课我们主要学习一下 Bootstrap 中的按钮和折叠插件. 一.按钮 可以通过按钮插件创建不同状态的按钮,也就是点击后为选中状态 ...

  10. OGNL支持各种纷繁复杂的表达式

    OGNL支持各种纷繁复杂的表达式.但是最最基本的表达式的原型,是将对象的引用值用点串联起来,从左到右,每一次表达式计算返回的结果成为当前对象,后面部分接着在当前对象上进行计算,一直到全部表达式计算完成 ...