设计模式之迭代器模式(Iterator Pattern)
一.什么是迭代器模式?
用迭代器来封装集合对象的遍历细节,使调用者能够通过统一的接口来实现对集合的遍历
迭代器也给集合对象提供了一定的保护,想要遍历集合,直接调用迭代器的方法就好了,我们不知道也不必知道集合内部的数据管理方式
二.举个例子
假设现有一组自定义对象,我们并不知道它们是用什么集合对象来维护的,可能是Array,List或者其它。而我们的工作是遍历这组对象(或者在遍历的基础上添一些额外处理)
想想我们要如何实现?
首先判断集合对象的类型,再分别作以不同处理
对于每一个不同集合类型,我们都需要一个不同的循环来处理,虽然这些循环块只有细微的差别,但我们也不得不提供一个循环去处理
。。如果有100种不同的集合类型,我们可能就必须用100个彼此差不多的循环去实现遍历,无疑存在大篇幅的冗余代码
所以我们需要一个统一的入口,希望把n个循环变成一个适应性很强的循环
那么迭代器就是我们朝思暮想的那个统一入口:
迭代器接口
package IteratorPattern; /**
* @author ayqy
* 定义迭代器
*/
public interface Iterator { /**
* @return 集合内是否存在下一个元素
*/
public abstract boolean hasNext();
/**
* @return 返回集合内的下一个元素
*/
public abstract Object next();
}
还需要实现一些具体的迭代器来实现遍历细节:
Array迭代器:
package IteratorPattern; /**
* @author ayqy
* 实现数组迭代器
*/
public class ArrayIterator implements Iterator{
MyObject[] arr;//自定义对象数组
int index = 0;//当前索引 public ArrayIterator(MyObject[] arr){
this.arr = arr;
} @Override
public boolean hasNext() {
if(index < arr.length && arr[index] != null)
return true; return false;
} @Override
public Object next() {
MyObject mo = arr[index];
index++; return mo;
}
}
P.S.注意Array迭代器的hasNext方法的具体实现
List迭代器:
package IteratorPattern; import java.util.List; /**
* @author ayqy
* 实现List迭代器
*/
public class ListIterator implements Iterator{
List<MyObject> list;//集合对象
int index = 0;//当前索引 public ListIterator(List<MyObject> list){
this.list = list;
} @Override
public boolean hasNext() {
if(index < list.size())
return true; return false;
} @Override
public Object next() {
MyObject mo = list.get(index);
index++; return mo;
}
}
有了这些具体迭代器,我们只需要一个循环就可以搞定了:
/**
* 打印集合所有内容
* @param iter 集合的迭代器
*/
private static void printObjs(Iterator iter){
while(iter.hasNext()){
System.out.println(iter.next().toString());
}
}
三.Java对Iterator的支持
由于迭代器的方便性与必要性,Java1.5之后就提供了对Iterator的支持,目前很多集合对象都支持Iterator,例如Set, List, Map, SortedSet, SortedMap, HashSet, TreeSet, ArrayList, LinkedList, Vector等等
唯一不支持迭代器的可能就是数组吧(栈,队列这些特殊的除外),上面我们实现了自定义的Iterator接口,其实Java本身提供这个接口(java.util.Iterator),但不同之处是:
Java.util.Iterator接口定义了三个方法(除hasNext,next方法外还有remove方法):

如果集合对象不愿意提供remove方法也没关系,我们可以抛出异常拒绝实现,就象这样:
package IteratorPattern; /**
* @author ayqy
* 利用Java提供的Iterator接口实现数组迭代器
*/
public class JavaArrayIterator implements java.util.Iterator{
MyObject[] arr;//自定义对象数组
int index = 0;//当前索引 public JavaArrayIterator(MyObject[] arr){
this.arr = arr;
} @Override
public boolean hasNext() {
if(index < arr.length && arr[index] != null)
return true; return false;
} @Override
public Object next() {
MyObject mo = arr[index];
index++; return mo;
} @Override
public void remove() {
//抛出操作不支持异常
throw new UnsupportedOperationException();
}
}
迭代器调用方式完全没变:
/**
* 打印集合所有内容
* @param iter 集合的迭代器
*/
private static void printObjs(java.util.Iterator iter){
while(iter.hasNext()){
System.out.println(iter.next().toString());
}
}
四.迭代器的隐式调用
很多语言都支持for each(或者 for in)循环,其内部实现就是调用了迭代器完成遍历
当然,只是一个小常识,更重要的是学会迭代器的设计原理,在需要的时候定义自己的迭代器
五.扩展
迭代器模式本身比较简单,甚至我们已经不需要去定义自己的迭代器了(API提供提供的迭代器接口几乎可以满足我们的需要了)
但迭代器与组合模式结合起来,可以做一些不可思议的事情(在组合模式中会作详细介绍,点我跳转>>)
设计模式之迭代器模式(Iterator Pattern)的更多相关文章
- 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)
原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...
- 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)
设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...
- 二十四种设计模式:迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现 ...
- [设计模式] 16 迭代器模式 Iterator Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对迭代器模式是这样说的:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示. 类图和实例: 迭代器模式由以下角 ...
- 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)
上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...
- 设计模式系列之迭代器模式(Iterator Pattern)——遍历聚合对象中的元素
模式概述 模式定义 模式结构图 模式伪代码 模式改进 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修 ...
- 设计模式 - 迭代器模式(iterator pattern) 具体解释
迭代器模式(iterator pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一 ...
- C#设计模式——迭代器模式(Iterator Pattern)
一.概述在软件开发过程中,我们可能会希望在不暴露一个集合对象内部结构的同时,可以让外部代码透明地访问其中包含的元素.迭代器模式可以解决这一问题.二.迭代器模式迭代器模式提供一种方法顺序访问一个集合对象 ...
- 迭代器模式(Iterator Pattern)
迭代器模式定义:Iterator Pattern提供一种方法顺序访问一个聚合元素中的各个元素,而又不暴漏内部方法 酒吧提供beer和wine: public class Bar { private L ...
- 设计模式之迭代器模式(Iterator)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
随机推荐
- php Pthread 多线程 (一) 基本介绍
我们可以通过安装Pthread扩展来让PHP支持多线程. 线程,有时称为轻量级进程,是程序执行的最小单元.线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,它与同属 ...
- Python发送邮件不需要发件人密码认证
#!/usr/bin/python # coding: UTF-8 import smtplib from email.mime.text import MIMEText receivers_list ...
- 20172325 2017-2018-2 《Java程序设计》第八周学习总结
20172325 2017-2018-2 <Java程序设计>第八周学习总结 教材学习内容总结 1.关于绑定 绑定:在执行程序时产生一个请求事件,需要执行一段代码来来完成方法调用,即一个方 ...
- OSGi 系列(三)之 bundle 事件监听
OSGi 系列(三)之 bundle 事件监听 bundle 的事件监听是在 bundle 生命周期的不同状态相互转换时,OSGi 框架会发出各种不同的事件供事先注册好的事件监听器处理. 1. 事件监 ...
- maven 编译的时候总是报一些奇怪的错误 比如 surefire-boot 2.10 .jar 可是私服里查看本来就没有这个高的版本。
或者私服总是 报 read time out , 或者 io 错误, 或者 gzip 解压错误,或者总是尝试下载一些高版本的jar , 而这些jar 可能是不存在的 .. 尝试 重新下载 apac ...
- struts2用到的jar有那些
struts2.0 lib/antlr-2.7.6.jarlib/struts2-core-2.0.14.jarlib/struts2-spring-plugin-2.0.14.jarlib/free ...
- Devexpress VCL Build v2014 vol 14.2.7发布
2015年马上快过去一半了,这个玩意还在纠结在14版.其实也无所谓,反正就是改成15版,也还是这些 东西的修补. What's New in 14.2.7 (VCL Product Line) N ...
- RESTful Web API 实践
REST 概念来源 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备...). 因此,必须有一种统一的机制,方便不同的前端设备与后端进行通 ...
- hdu-1394(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 思路:建立一个空线段树,求出逆序数,(逆序数性质:交换两个相邻数,逆序数+1或-1, 交换两个不 ...
- gj11 多线程、多进程和线程池编程
11.1 python中的GIL # coding=utf-8 # gil global interpreter lock (cpython) # python中一个线程对应于c语言中的一个线程 # ...