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

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

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

  怎么做?

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

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

  这时候,我们希望创建一种超集合(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;
}
}
    @Test
void testFruitShop() {
FruitShop fruitShop = new FruitShop();
fruitShop.addProduct("Apple");
fruitShop.addProduct("Orange");
String[] products = fruitShop.getProducts();
for (String product : products) {
System.out.println(product);
}
} @Test
void 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");
}
} @Override
public boolean hasNext() {
return iteratorIndex < index;
} @Override
public 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);
} @Override
public boolean hasNext() {
return iteratorIndex < products.size();
} @Override
public String next() {
return products.get(iteratorIndex++);
}
}
    @Test
void testFruitShopIterator() {
FruitShopIterator fruitShop = new FruitShopIterator();
fruitShop.addProduct("Apple");
fruitShop.addProduct("Orange");
while (fruitShop.hasNext()) {
System.out.println(fruitShop.next());
}
} @Test
void 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. 客户端采用统一的方式去遍历数据。

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

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

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

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

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

  3. C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看."迭代器模 ...

  4. 《JAVA设计模式》之迭代器模式(Iterator)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述迭代子(Iterator)模式的: 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不 ...

  5. 迭代器模式 Iterator 行为型 设计模式(二十)

    迭代器模式(Iterator)   走遍天下,世界那么大,我想去看看   在计算机中,Iterator意为迭代器,迭代有重复的含义,在程序中,更有“遍历”的含义 如果给定一个数组,我们可以通过for循 ...

  6. Java 设计模式系列(十五)迭代器模式(Iterator)

    Java 设计模式系列(十五)迭代器模式(Iterator) 迭代器模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(interna ...

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

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

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

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

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

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

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

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

随机推荐

  1. 协议学习之 vamei博客系列 总结

    1. 分层: 物理层(physical layer) 所谓的物理层,是指光纤.电缆或者电磁波等真实存在的物理媒介.这些媒介可以传送物理信号,比如亮度.电压或者振幅.对于数字应用来说,我们只需要两种物理 ...

  2. 【UML】对象图Object diagram(转)

    http://blog.csdn.net/sds15732622190/article/details/48894751 前言 今天要说的是UML中的对象图.他与类图,合作图都有关系,是类图的实例化. ...

  3. UVA 1153 Keep the Customer Satisfied 顾客是上帝(贪心)

    因为每增加一个订单,时间是会增加的,所以先按截止时间d排序, 这样的话无论是删除一个订单,或者增加订单,都不会影响已经选好的订单. 然后维护一个已经选好的订单的大根堆(优先队列),如果当前无法选择的话 ...

  4. Vue中使用computed与watch结合实现数据变化监听

    目的:当数据变化时,为其中重要数据增加边框,实现闪烁以达到提醒目的.数据格式如下,只有在未处理火警/故障时增加闪烁边框.可以使用watch进行深度监听.数据格式已定,也非常明确要监听的数据是有两个.既 ...

  5. 通用的flash代码

    黑体字部分为常修改的部分 <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase=&quo ...

  6. linux - mysql 安装教程

    环境介绍>>>>>>>>>>>>>>>>>> 操作系统:Centos 7 mysql数据库版 ...

  7. 关于cocos2dx for lua资源加载优化方案

    之前我写游戏加载都是从一个json文件写入要加载的文件名来实现加载,但是如果资源 比较多的情况下,会导致非常难管理,需要逐个写入.所以换了另外一种方式来加载文件. 首先,我是通过场景之前的切换时候,加 ...

  8. iOS微信小视频优化心得

    小视频是微信6.0版本重大功能之一,在开发过程中遇到不少问题.本文先叙述小视频的产品需求,介绍了几个实现方案,分析每个方案的优缺点,最后总结出最优的解决方案. 小视频播放需求 可以同时播放多个视频 用 ...

  9. ReactiveCocoa入门-part1

    作为一个iOS开发者,你写的每一行代码几乎都是在响应某个事件,例如按钮的点击,收到网络消息,属性的变化(通过KVO)或者用户位置的变化(通过CoreLocation).但是这些事件都用不同的方式来处理 ...

  10. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined)

    A. Broken Clock time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...