概述

网上大部分人说迭代模式的时候,总是以某一种可遍历的对象为例进行介绍。这是可行的,这也是迭代模式的基本原型。当我看到《Head Frist设计模式》中迭代模式的时候,感觉要是能从另一个角度来说明,可能更能够体现迭代模式的威力所在。

本文介绍的这种迭代模式,倒是更像是适配器-迭代器模式。希望于你有益~

版权说明

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Q-WHai
发表日期: 2016年3月4日
链接:https://qwhai.blog.csdn.net/article/details/50799562
来源:CSDN
更多内容:分类 >> 设计模式

模式说明

网上大多数关于迭代器模式的文章,讨论都是建立在一个List或是其他可迭代对象之上的。这样有一个问题,因为都是可迭代的对象,在迭代的过程中我们无法深入了解到迭代器模式能够为我们解决什么样的问题。下面有一个实例,通过这个实例可能可以说明迭代器模式的威力。

1.实例背景

有两家餐厅A和B,餐厅A是一家早餐餐厅店,而餐厅B是一家午餐餐厅店。

现在两个餐厅的大Boss决定将两家餐厅进行合并。在餐厅A中,菜单的逻辑实现是基于ArrayList的,而餐厅B的菜单逻辑实现则是基于数组的。如果去修改任何一家餐厅的菜单实现,都可能会引发一些不必要的修改,且这种修改可能还会导致不必要的Bug,所以A和B都不愿意去修改菜单的原始实现。

现在的需求是,在不改变两家餐厅对菜单的实现上,再方便地对菜单进行遍历。

-- 摘自《Head Frist设计模式》

2.思路分析

这个有什么难的?ArrayList和数组都是可循环遍历的对象,那么我们不是可以依次对这两个数组进行循环遍历么?

不可否认,这是一种最为朴素的实现逻辑,而且易懂。可是,这种方式真的是好的么?如果现在有100家餐厅呢?我们希望的是能够更方便、更优雅地进行遍历菜单,我们希望在后期的项目中,代码的维护性更高,而不是一直“烂”下去。

我们想如果我们的ArrayList和数组可以有一个公共的接口,那么我们就可以通过这个公共的接口进行迭代,这样一来代码的复用性岂不是更高了么?可是,如何找到这样的一个接口呢?在学习《Effective Java》这本神书的“类和接口”一单时,就了解到我们的程序中,复合优于继承。所以,这里我们可以将ArrayList和数组分别组合到不同的菜单中去,这样对菜单的遍历就是对ArrayList或是数组的遍历。

因为ArrayList自身就包含了迭代器,所以这里我们不需要为ArrayList创建迭代器。而在数组中则没有这样的迭代逻辑,所以我们要为数组额外创建迭代器。

3.类图

根据上面的分析,我们可以画出如下类图:

图-1 迭代器模式类图

4.逻辑实现

(1)公共接口编写

在类图中的第一个位置就留给了Menu这个接口了,添加此接口的目的在于提高代码的可复用性。这一点在第(4)点迭代逻辑中会有所体现。公共接口代码如下:

public interface Menu {public Iterator<MenuItem> createIterator();
}

(2)迭代器的创建

在上面的类图中我们可以找到BreakfastMenu和LunchMenu两个菜单类,它们都是实现了Menu接口的。可是,因为它们包含了不同的容器对象(BreakfastMenu包含了ArrayList,LunchMenu包含了数组),所以在创建迭代器的时候就会有所不同。

先来看看BreakfastMenu创建迭代器的逻辑代码吧,如下:

@Overridepublic Iterator<MenuItem> createIterator() {return menuItems.iterator();}

因为ArrayList自身就包含了迭代器的实现,所以这里就可以直接返回ArrayList的迭代器。而数组没有迭代器的实现部分,所以与上面的创建方式会有所不同,如下:

@Overridepublic Iterator<MenuItem> createIterator() {return new LunchIterator(menuItems);}

(3)自定义迭代器

由于数组本身不具备迭代的功能,所以我们就需要对其进行扩展。可是,如果想要“迭代”数组,其根本实现还是要依赖于数组的循环遍历。因为数组只有这一种方式可以依次提取元素。在迭代器中有两个核心方法:hasNext()和next()。所以,我们就利用这两个方法变相实现对数组的迭代。代码如下:

public class LunchIterator implements Iterator<MenuItem> {private MenuItem[] menuItems = null;private int position = 0;public LunchIterator(MenuItem[] _menuItems) {this.menuItems = _menuItems;}@Overridepublic boolean hasNext() {if (menuItems == null) {return false;}return position < menuItems.length;}@Overridepublic MenuItem next() {MenuItem menuItem = menuItems[position];position++;return menuItem;}
}

这里有一个额外定义的变量position,它是用来进行元素索引的,我们需要通过此变量提取元素,和判别迭代完成。

(4)迭代逻辑

这里说的迭代逻辑是针对迭代器之外,客户端的实现逻辑。假定我们有一个女服务员,她可以打印出客户所需要的菜单,而不用关心此菜单的实现方式。

public class Waitress {private Iterator<MenuItem> iterator = null;private Menu menu = null;public Waitress(Menu _menu) {this.menu = _menu;}public void printMenu() {System.out.println("\n菜单:");iterator = menu.createIterator();do {System.out.println(iterator.next());} while (iterator.hasNext());}
}

Ref

  • 《Head Frist设计模式》
  • 《23种Java设计模式》

Github源码下载

https://github.com/qwhai/design-pattern

征集

如果你也需要使用ProcessOn这款在线绘图工具,可以使用如下邀请链接进行注册:
https://www.processon.com/i/56205c2ee4b0f6ed10838a6d

Java设计模式——迭代器模式相关推荐

  1. java设计模式迭代器模式_迭代器设计模式示例

    java设计模式迭代器模式 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式 ...

  2. java设计模式迭代器模式_Java中的迭代器设计模式–示例教程

    java设计模式迭代器模式 迭代器模式是一种行为模式,它用于提供遍历一组对象的标准方式. Iterator模式在Java Collection Framework中得到了广泛使用,其中Iterator ...

  3. java设计模式迭代器模式_迭代器模式和Java

    java设计模式迭代器模式 大家好,在本文中,我们将检查Iterator Pattern . 我知道你们中许多人已经使用过一种设计模式,但是也许您没有意识到它是模式,或者不知道它的巨大价值. 根据&l ...

  4. java设计模式迭代器模式_Java中的迭代器设计模式

    java设计模式迭代器模式 Iterator design pattern in one of the behavioral pattern. Iterator pattern is used to ...

  5. JAVA 设计模式 迭代器模式

    用途 迭代器模式 (Iterator) 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 迭代器模式是一种行为型模式. 结构 图-迭代器模式结构图 Iterator : 定义访 ...

  6. java设计模式---迭代器模式

    定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节. 类型:行为类模式 类图:        如果要问java中使用最多的一种模式,答案不是单例模式,也不是工厂模式,更不是策略模 ...

  7. 23种设计模式-迭代器模式《三国名将》

    对于许久不用的东西,容易忘记.百度许久,也未能找到自己所要. 从今日起,有些东西就记载下来,不仅方便自己,希望能帮到他人吧! 定义 提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部 ...

  8. Java 设计模式——状态模式

    概述 很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像.你可以阅读<Java设计模式--策略模式>这篇博客,并与本文对比,以找到蛛丝马 ...

  9. Java设计模式——Builder模式

    前言 之前写Android程序的时候,经常会用到Dialog(对话框)这个控件.我们在使用Dialog,比如AlertDialog的时候就用到了这里要说明的Builder模式.现在我们来看一下这样的一 ...

最新文章

  1. Java程序设计第二次作业
  2. 深度学习 Neural Style 之TensorFlow实践
  3. 计算机模拟多孔碳,多孔碳材料分子设计的三种方法
  4. 熊猫tv新功能介绍_熊猫简单介绍
  5. bugzilla dbd-mysql_别人写的关于在Windows下安装BugZilla的说明,不错,值得借鉴
  6. 【Java】撩开Java线程的“神秘面纱”
  7. Serializable序列化
  8. 详解TCP和UDP数据段的首部格式
  9. DS1302时钟模块简单介绍
  10. VB.NET (VB2008)的免费下载网址
  11. 人脸识别:技术应用与商业实践
  12. IMAP 协议/命令
  13. oracle语句报错 * ERROR at line 2: ORA-00923: FROM keyword not found where expected
  14. linux xsh加密传输,WBB - 解决Xshell迁移/同步xsh文件时,ssh秘钥密码/密码丢失问题...
  15. 【硬件学习笔记】防反接保护电路
  16. python时区运算,时区,时间戳,夏令时讲解
  17. QUASI-HYPERBOLIC (拟双曲线) MOMENTUM AND ADAM FOR DEEP LEARNING——精读
  18. markdown使用数学符号/特殊符号
  19. iOS原生封装二维码、条形码扫描工具;生成、识别(彩色)二维码、条形码图片
  20. Markdown添加目录(自定义目录)

热门文章

  1. C++ Primer 5th笔记(3)字符串、向量和数组:字符串
  2. 设计模式--代理(Proxy)模式
  3. base64/32/16编码
  4. 【Flask】flask入门以及第一个flask项目的创建
  5. (58)模拟线程切换——添加挂起、恢复线程功能
  6. 【PAT乙级】1080 MOOC期终成绩 (25 分)
  7. Java集合Vector
  8. Spring和SpringMVC的父子容器关系
  9. JSP页面Table的数据绑定
  10. MySQL带LIKE关键字的查询