• 什么时候需要用到迭代器模式?

  有许多中方法,可以把对象堆起来放进一个集合(可以是数组、堆栈、列表、哈希表,等等)。

  每一种类型的集合,都有各自适用的时机。但是某个时间段,客户端可能希望去遍历这个集合。

  怎么做?

  让客户去得到这个集合的具体实现?显然这不是很现实。

  而且针对不同的集合,我们需要用不同的方式去遍历它,这需要去深入了解各种数据结构,对客户端很不友好。

  这时候,我们希望创建一种超集合(super collection),是客户端能够使用统一的方法去遍历集合,同时不需要关心具体的数据结构。

  这就是迭代器模式。

  • 迭代器模式:

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

  从 Java 的角度来说,迭代器模式就是 Iterator 接口。

  • 模拟场景:

  有一个水果商店(FruitShop),内部采取数组的方式存储数据。

  有一个肉食商店(MeatShop),内部采用链表的方式存储数据。

  客户端希望去遍历这些数据,

  • 没有迭代器的实现:
public final class FruitShop {private String[] products = new String[MAX_PRODUCT];private int index = 0;private static final int MAX_PRODUCT = 10;public void addProduct(String product) {if (index < MAX_PRODUCT) {products[index++] = product;} else {throw new RuntimeException("FruitShop is full");}}public String[] getProducts() {return Arrays.copyOf(products, index);}
}

public final class MeatShop {private List<String> products = new LinkedList<>();public void addProduct(String product) {products.add(product);}public List<String> getProducts() {return products;}
}

    @Testvoid testFruitShop() {FruitShop fruitShop = new FruitShop();fruitShop.addProduct("Apple");fruitShop.addProduct("Orange");String[] products = fruitShop.getProducts();for (String product : products) {System.out.println(product);}}@Testvoid testMeatShop() {MeatShop meatShop = new MeatShop();meatShop.addProduct("Beef");meatShop.addProduct("Pork");List<String> products = meatShop.getProducts();for (String product : products) {System.out.println(product);}}

  上面的代码有如下的问题:

  1. 两个 Shop 暴露了内部的数据结构。
  2. 客户端采取不同的方法去遍历数据。
  • 包含迭代器的实现
public final class FruitShopIterator implements Iterator<String> {private String[] products = new String[MAX_PRODUCT];private int index = 0;private int iteratorIndex = 0;private static final int MAX_PRODUCT = 10;public void addProduct(String product) {if (index < MAX_PRODUCT) {products[index++] = product;} else {throw new RuntimeException("FruitShop is full");}}@Overridepublic boolean hasNext() {return iteratorIndex < index;}@Overridepublic String next() {return products[iteratorIndex++];}
}

public final class MeatShopIterator implements Iterator<String> {private List<String> products = new LinkedList<>();private int iteratorIndex = 0;public void addProduct(String product) {products.add(product);}@Overridepublic boolean hasNext() {return iteratorIndex < products.size();}@Overridepublic String next() {return products.get(iteratorIndex++);}
}

    @Testvoid testFruitShopIterator() {FruitShopIterator fruitShop = new FruitShopIterator();fruitShop.addProduct("Apple");fruitShop.addProduct("Orange");while (fruitShop.hasNext()) {System.out.println(fruitShop.next());}}@Testvoid testMeatShopIterator() {MeatShopIterator meatShop = new MeatShopIterator();meatShop.addProduct("Beef");meatShop.addProduct("Pork");while (meatShop.hasNext()) {System.out.println(meatShop.next());}}

  可以看出:

  1. Iterator 提供了 hasNext() 和 next() 方法负责集合数据的遍历。
  2. Shop 类避免了暴露具体的数据结构。
  3. 客户端采用统一的方式去遍历数据。

转载于:https://www.cnblogs.com/jing-an-feng-shao/p/10842137.html

设计模式(十六)迭代器模式 Iterator相关推荐

  1. 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)

    设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型) 1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用 ...

  2. [设计模式-行为型]迭代器模式(Iterator)

    一句话 用过Java 的Iterator 的方法对这个就不会陌生了. 好处是提供一种方法访问一个容器对象中的各个元素,而又不暴露该容器对象的内部细节. 概括 解析 迭代子模式:迭代子模式可以顺序访问一 ...

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

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

  4. 设计模式:迭代器模式(Iterator Pattern)

    迭代器模式(Iterator Pattern): 属于行为型模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即: 不暴露其内部结构.

  5. 设计模式详解(二十)——迭代器模式

    一.场景问题 在激烈的市场竞争中,为了提高自己的硬实力,A公司和B公司决定合并.现在目前二者的员工信息都存放在不同的数据库中,且存储的方式不同,请设计出统一的读取所有员工(A.B公司之和)信息的接口. ...

  6. c++迭代器模式iterator

    c++迭代器模式iterator 概念 角色和职责 案例 概念 Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍 ...

  7. 迭代器模式(Iterator)解析例子

    摘要:本文深入浅出的讲述了设计模式中的迭代器模式,并给出了简单的示例,例子浅显易懂,并附带源代码. 迭代器模式属于行为型模式,其意图是提供一种方法顺序访问一个聚合对象中得各个元素,而又不需要暴露该对象 ...

  8. 《Android源码设计模式》之迭代器模式

    迭代器模式介绍 迭代器模式(Iterator Pattern)又称为游标(Cursor) 模式,是行为型设计模式之一.我们对容器对象的访问必然会涉及遍历算法,如果我没将遍历方法封装到容器中,那么对于容 ...

  9. Java设计模式系列之——迭代器模式

    本篇我们采取倒叙的手法来讲解迭代器模式,先看下面一段我们在平时工作中常见的代码: package com.mazhichu.designpatterns.iterator;import java.ut ...

  10. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

最新文章

  1. unix环境高级编程 pdf_UNIX系统编程宝典,每一本都值得程序员珍藏
  2. IPSEC ××× 互通性测试结果(二)
  3. 普通平键的主要尺寸有_工字钢尺寸大全
  4. C语言——反弹球游戏(第三阶段
  5. LVS(13)——DR模型准备工作及ip地址冲突问题
  6. 深入了解gradle和maven的区别
  7. c++opencv显示中文_OpenCV如何入门秘籍
  8. 李佳琦抢了薇娅的流量
  9. SAP License:SAP订单的归档及删除
  10. 20个Python实战项目(附源码),拿走就用。
  11. 【JY】反应谱的详解与介绍
  12. 便携式频谱仪无人机机载频谱仪解决方案
  13. PS-怎么使用参考线?
  14. 微博登录及删除粉丝/转发/评论的脚本[更新中]
  15. 【增强版】快速判断工作簿中是否存在指定工作表
  16. 一个优秀程序员可抵五个普通程序员!
  17. windows2016小文件服务器,Windows Server 2016 搭建 SMB 共享文件
  18. 常见文章、图文素材采集软件优缺点比较分析
  19. 如何使用cAdvisor和Wavefront监控容器
  20. 洛谷P3899 [湖南集训]谈笑风生

热门文章

  1. Leetcode134.加油站
  2. 设计者模式之GOF23命令模式
  3. php sql慢查询,Select多行SQL语句慢查询优化
  4. keil4出现目标未被创建_STM32入门系列-创建寄存器模板
  5. java 序列化,流,二进制的区别和联系
  6. k8s traefik 映射外部服务,映射其他域名,映射内网其他服务
  7. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_09-修改页面-服务端-接口开发...
  8. jdk环境配置-windows 10
  9. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第2节 线程实现方式_13_Thread和Runnable的区别...
  10. Java中高级面试必问之多线程TOP50(含答案)