设计模式(十六)迭代器模式 Iterator
- 什么时候需要用到迭代器模式?
有许多中方法,可以把对象堆起来放进一个集合(可以是数组、堆栈、列表、哈希表,等等)。
每一种类型的集合,都有各自适用的时机。但是某个时间段,客户端可能希望去遍历这个集合。
怎么做?
让客户去得到这个集合的具体实现?显然这不是很现实。
而且针对不同的集合,我们需要用不同的方式去遍历它,这需要去深入了解各种数据结构,对客户端很不友好。
这时候,我们希望创建一种超集合(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);
}
}
上面的代码有如下的问题:
- 两个 Shop 暴露了内部的数据结构。
- 客户端采取不同的方法去遍历数据。
- 包含迭代器的实现
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());
}
}
可以看出:
- Iterator 提供了 hasNext() 和 next() 方法负责集合数据的遍历。
- Shop 类避免了暴露具体的数据结构。
- 客户端采用统一的方式去遍历数据。
设计模式(十六)迭代器模式 Iterator的更多相关文章
- 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)
设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型) 1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的 ...
- 设计模式系列之迭代器模式(Iterator Pattern)——遍历聚合对象中的元素
模式概述 模式定义 模式结构图 模式伪代码 模式改进 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修 ...
- C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看."迭代器模 ...
- 《JAVA设计模式》之迭代器模式(Iterator)
在阎宏博士的<JAVA与模式>一书中开头是这样描述迭代子(Iterator)模式的: 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不 ...
- 迭代器模式 Iterator 行为型 设计模式(二十)
迭代器模式(Iterator) 走遍天下,世界那么大,我想去看看 在计算机中,Iterator意为迭代器,迭代有重复的含义,在程序中,更有“遍历”的含义 如果给定一个数组,我们可以通过for循 ...
- Java 设计模式系列(十五)迭代器模式(Iterator)
Java 设计模式系列(十五)迭代器模式(Iterator) 迭代器模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(interna ...
- 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)
上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...
- 二十四种设计模式:迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现 ...
- 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)
原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...
- 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)
设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...
随机推荐
- 2017.10.6 QBXT 模拟赛
题目链接 T1 Sort 一下与原数组比较 ,若有两个数或者没有数发生位置交换 ,则输出YES ,否则输出NO #include <algorithm> #include <ccty ...
- 苹果ATS Win2008 R2 IIS7.5 HTTPS 证书的那些可能遇到的坑
前言:工作这么多年,每一次要弄https 都和苹果有关,上一次是苹果app的企业安装形式,ios7后 .plist 文件必须在一个https路径. 这一次则是苹果的ATS计划,无疑这是在推动网络安全上 ...
- JAVA多线程编程——JAVA内存模型
一.何为“内存模型” 内存模型描述了程序中各个变量(实例域.静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节,对象最终是存储在内存里面的,但是编译器 ...
- UVA 12898 - And Or 与和或 (思路题)
思路就是有零一变化的位Or以后一定是1,And以后一定是0:那么如果b的二进制更长那么就把包含a的部分全部置为1或0,如果一样长那么就把不同的部分置为1或0. 今天被这题坑的地方:1默认是int,如果 ...
- Android(java)学习笔记125:保存数据到SD卡 (附加:保存数据到内存)
1. 如果我们要想读写数据到SD卡中,首先必须知道SD的路径: File file = new File(Environment.getExternalStorageDirectory()," ...
- [论文理解] MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications Intro MobileNet 我 ...
- CentOS配置主机名和主机映射
1.修改本机主机名 vi /etc/sysconfig/network 修改hostname HOSTNAME=s0 2.配置主机映射 vi /etc/hosts 修改内容如下 192.168.32. ...
- Feign-手动创建FeignClient
前言 在<Feign-请求不同注册中心的服务>中,提到,如果需要请求不同注册中心的服务,可以设置@FeignClient的url属性. 这种做法有个缺点,需要服务消费者,配置各个环境的ur ...
- 采用maven 对tomcat 进行自动部署
在工作过程中经常会遇到项目频繁发不到额过程,而且在这个过程中会一直进行一些简单但是繁琐的重复性工程 1.打war 包 2.停掉tomcat 3.copy war 包 4.启动tomcat 听说mave ...
- javascript原生方法集锦
1.sort方法sort()方法使数组中的元素按照一定的顺序排列. 语法: arrayObject.sort(方法函数) 参数说明: 1.如果不指定<方法函数>,则按unicode码顺序排 ...