一.什么是迭代器模式?

用迭代器来封装集合对象的遍历细节,使调用者能够通过统一的接口来实现对集合的遍历

迭代器也给集合对象提供了一定的保护,想要遍历集合,直接调用迭代器的方法就好了,我们不知道也不必知道集合内部的数据管理方式

二.举个例子

假设现有一组自定义对象,我们并不知道它们是用什么集合对象来维护的,可能是Array,List或者其它。而我们的工作是遍历这组对象(或者在遍历的基础上添一些额外处理)

想想我们要如何实现?

首先判断集合对象的类型,再分别作以不同处理

对于每一个不同集合类型,我们都需要一个不同的循环来处理,虽然这些循环块只有细微的差别,但我们也不得不提供一个循环去处理

。。如果有100种不同的集合类型,我们可能就必须用100个彼此差不多的循环去实现遍历,无疑存在大篇幅的冗余代码

所以我们需要一个统一的入口,希望把n个循环变成一个适应性很强的循环

那么迭代器就是我们朝思暮想的那个统一入口:

迭代器接口

  1. package IteratorPattern;
  2.  
  3. /**
  4. * @author ayqy
  5. * 定义迭代器
  6. */
  7. public interface Iterator {
  8.  
  9. /**
  10. * @return 集合内是否存在下一个元素
  11. */
  12. public abstract boolean hasNext();
  13. /**
  14. * @return 返回集合内的下一个元素
  15. */
  16. public abstract Object next();
  17. }

还需要实现一些具体的迭代器来实现遍历细节:

Array迭代器:

  1. package IteratorPattern;
  2.  
  3. /**
  4. * @author ayqy
  5. * 实现数组迭代器
  6. */
  7. public class ArrayIterator implements Iterator{
  8. MyObject[] arr;//自定义对象数组
  9. int index = 0;//当前索引
  10.  
  11. public ArrayIterator(MyObject[] arr){
  12. this.arr = arr;
  13. }
  14.  
  15. @Override
  16. public boolean hasNext() {
  17. if(index < arr.length && arr[index] != null)
  18. return true;
  19.  
  20. return false;
  21. }
  22.  
  23. @Override
  24. public Object next() {
  25. MyObject mo = arr[index];
  26. index++;
  27.  
  28. return mo;
  29. }
  30. }

P.S.注意Array迭代器的hasNext方法的具体实现

List迭代器:

  1. package IteratorPattern;
  2.  
  3. import java.util.List;
  4.  
  5. /**
  6. * @author ayqy
  7. * 实现List迭代器
  8. */
  9. public class ListIterator implements Iterator{
  10. List<MyObject> list;//集合对象
  11. int index = 0;//当前索引
  12.  
  13. public ListIterator(List<MyObject> list){
  14. this.list = list;
  15. }
  16.  
  17. @Override
  18. public boolean hasNext() {
  19. if(index < list.size())
  20. return true;
  21.  
  22. return false;
  23. }
  24.  
  25. @Override
  26. public Object next() {
  27. MyObject mo = list.get(index);
  28. index++;
  29.  
  30. return mo;
  31. }
  32. }

有了这些具体迭代器,我们只需要一个循环就可以搞定了:

  1. /**
  2. * 打印集合所有内容
  3. * @param iter 集合的迭代器
  4. */
  5. private static void printObjs(Iterator iter){
  6. while(iter.hasNext()){
  7. System.out.println(iter.next().toString());
  8. }
  9. }

三.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方法也没关系,我们可以抛出异常拒绝实现,就象这样:

  1. package IteratorPattern;
  2.  
  3. /**
  4. * @author ayqy
  5. * 利用Java提供的Iterator接口实现数组迭代器
  6. */
  7. public class JavaArrayIterator implements java.util.Iterator{
  8. MyObject[] arr;//自定义对象数组
  9. int index = 0;//当前索引
  10.  
  11. public JavaArrayIterator(MyObject[] arr){
  12. this.arr = arr;
  13. }
  14.  
  15. @Override
  16. public boolean hasNext() {
  17. if(index < arr.length && arr[index] != null)
  18. return true;
  19.  
  20. return false;
  21. }
  22.  
  23. @Override
  24. public Object next() {
  25. MyObject mo = arr[index];
  26. index++;
  27.  
  28. return mo;
  29. }
  30.  
  31. @Override
  32. public void remove() {
  33. //抛出操作不支持异常
  34. throw new UnsupportedOperationException();
  35. }
  36. }

迭代器调用方式完全没变:

  1. /**
  2. * 打印集合所有内容
  3. * @param iter 集合的迭代器
  4. */
  5. private static void printObjs(java.util.Iterator iter){
  6. while(iter.hasNext()){
  7. System.out.println(iter.next().toString());
  8. }
  9. }

四.迭代器的隐式调用

很多语言都支持for each(或者 for in)循环,其内部实现就是调用了迭代器完成遍历

当然,只是一个小常识,更重要的是学会迭代器的设计原理,在需要的时候定义自己的迭代器

五.扩展

迭代器模式本身比较简单,甚至我们已经不需要去定义自己的迭代器了(API提供提供的迭代器接口几乎可以满足我们的需要了)

但迭代器与组合模式结合起来,可以做一些不可思议的事情(在组合模式中会作详细介绍,点我跳转>>

设计模式之迭代器模式(Iterator Pattern)的更多相关文章

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

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

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

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

  3. 二十四种设计模式:迭代器模式(Iterator Pattern)

    迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现 ...

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

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

  5. 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)

    上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...

  6. 设计模式系列之迭代器模式(Iterator Pattern)——遍历聚合对象中的元素

    模式概述 模式定义 模式结构图 模式伪代码 模式改进 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修 ...

  7. 设计模式 - 迭代器模式(iterator pattern) 具体解释

    迭代器模式(iterator pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一 ...

  8. C#设计模式——迭代器模式(Iterator Pattern)

    一.概述在软件开发过程中,我们可能会希望在不暴露一个集合对象内部结构的同时,可以让外部代码透明地访问其中包含的元素.迭代器模式可以解决这一问题.二.迭代器模式迭代器模式提供一种方法顺序访问一个集合对象 ...

  9. 迭代器模式(Iterator Pattern)

    迭代器模式定义:Iterator Pattern提供一种方法顺序访问一个聚合元素中的各个元素,而又不暴漏内部方法 酒吧提供beer和wine: public class Bar { private L ...

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

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

随机推荐

  1. Windows2008 IIS + .NET环境搭建指南

    Windows下最常用的网页服务器是自带的IIS,这里将为大家演示,windows2008下如何搭建IIS + .NET的动态网页环境. 环境配置:Qcloud 云服务器 windows 200864 ...

  2. android示例:一个简单的登陆程序

    最近写了个简单的登陆程序,有几点收获: 1.懂得如何在LinearLayout中嵌套LinearLayout,完善布局的行列: 2.用android:layout_weight控制控件的比重: 3.用 ...

  3. java web 常用正则

    什么是 RegExp? RegExp 是正则表达式(Regular expression)的缩写,作用是对字符串执行模式匹配. 通常用于格式验证.正则替换.查找子串等 各种编程语言的正则表达式基本相同 ...

  4. XAMPP下apache部署网站,多个虚拟机(空间)配置

     之 前在 Mac 下一直使用 MAMP 搭建本地 php 环境,因为其强大的组合配置以及方便的 UI 操作.因为公司的电脑是 Windows 的,有时候需要搭建 php 环境来调试一些小东西方便自己 ...

  5. [leetcode]139. Word Break单词能否拆分

    Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine ...

  6. Task/Parallel实现异步多线程

    代码: #region Task 异步多线程,Task是基于ThreadPool实现的 { //TestClass testClass = new TestClass(); //Action<o ...

  7. PhpStorm 2017 激活办法

    最新版PhpStorm 2017正式版改进了PHP 7支持,改进代码完成功能.PhpStorm 绝对是PHP开发最好的开发工具. phpstorm已经升级到2017.1,原注册码失效,2017.1.2 ...

  8. OSGi 系列(十二)之 Http Service

    OSGi 系列(十二)之 Http Service 1. 原始的 HttpService (1) 新建 web-osgi 工程,目录结构如下: (2) HomeServlet package com. ...

  9. 二进制搭建kubernetes多master集群【一、使用TLS证书搭建etcd集群】

    上一篇我们介绍了kubernetes集群架构以及系统参数配置,参考:二进制搭建kubernetes多master集群[开篇.集群环境和功能介绍] 下面本文etcd集群才用三台centos7.5搭建完成 ...

  10. 着重基础之—Spring Boot 编写自己的过滤器

    Spring Boot 编写自己的"过滤器" 又好久没有写博客进行总结了,说实话,就是 "懒",懒得总结,懒得动.之所以写这篇博客,是因为最近对接公司SSO服务的时候,需要自定义拦 ...