设计模式 - Iterator(迭代器)
2019独角兽企业重金招聘Python工程师标准>>>
模式用途:设计能装载任意对象的容器,并要求该容器有一个遍历元素的iterator()方法,用来遍历容器中的每个元素。
设计一个容器的接口,用来定义这些”能装载任意对象的容器”的方法,从而在使用这些容器的时候可以更加灵活,更换起来只需要更改装载的容器的类型即可,其他方法都不用改变。
Ø 接口Collection.java
package com.yilong.designpattern.iterator;
public interface Collection {
public void add(Object obj);
public int size();
public Iterator iterator();
}
Ø 实现了Collection接口的ArrayList.java
package com.yilong.designpattern.iterator;
public class ArrayList implements Collection {
Object[] objs = new Object[10];
int index = 0;
public void add(Object obj) {
if(index == objs.length) {
Object[] newObjs = new Object[objs.length * 2];
System.arraycopy(objs, 0, newObjs, 0, objs.length);
objs = newObjs;
}
objs[index] = obj;
index ++;
}
public Iterator iterator() {
return new ArrayIterator(this);
}
public int size() {
return index;
}
public Object get(int i) {
return objs[i];
}
}
说明:System.arraycopy(objs, 0, newObjs, 0, objs.length);表示把objs数组中索引为0-objs.length的元素复制到数组newObjs中,第一个0表示从newObjs的0位置开始复制。
容器的iterator()方法会调用适合本身容器进行遍历的迭代器Iterator。
还需要注意的一点是get(int i)方法不要放在Collection接口的方法定义中,因为Collection接口已经有iterator()方法足以遍历容器中元素了, 可见get(int i)方法并不是每种容器都必须的,因此更加适合于只定义在具体的容器中。
Ø 迭代器接口Iterator.java
package com.yilong.designpattern.iterator;
public interface Iterator {
public boolean hasNext();
public Object next();
}
说明:该接口主要有两个方法,一个是判断容器中是否还有下一个元素的hasNext(),另一个是取出容器中下一个元素next()方法。
Ø 实现了Iterator接口的ArrayIterator.java
package com.yilong.designpattern.iterator;
public class ArrayIterator implements Iterator{
private ArrayList arrayList;
private int index = 0;
ArrayIterator(ArrayList arrayList) {
this.arrayList = arrayList;
}
public boolean hasNext() {
if(this.index < this.arrayList.size()) {
return true;
} else {
return false;
}
}
public Object next() {
Object obj = arrayList.get(this.index);
this.index ++;
return obj;
}
}
说明:主要用以对ArrayList容器进行遍历的iterator类。
Ø Book.java
package com.yilong.designpattern.iterator;
public class Book {
private String bookName;
public Book(String bookName) {
this.bookName = bookName;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
}
Ø Main.java
package com.yilong.designpattern.iterator;
public class Main {
public static void main(String[] args) {
Collection objList = new ArrayList();
objList.add(new Book("《名侦探柯南》"));
objList.add(new Book("《游戏王》"));
objList.add(new Book("《三国演义》"));
Iterator iterator = objList.iterator();
while(iterator.hasNext()) {
Book book = (Book)iterator.next();
System.out.println(book.getBookName());
}
}
}
该设计模式的UML图如下:
说明:JDK的Iterator与上述的设计原理完全一样,因此测试的代码可以直接copy上述的代码,只需要引入具体的包即可。
Ø Main.java
package com.yilong.test.jdk.iterator;
import java.util.ArrayList;
import
转载于:https://my.oschina.net/lovedreamland/blog/12998
设计模式 - Iterator(迭代器)相关推荐
- [C# 设计模式] Iterator - 迭代器模式:我与一份奥利奥早餐的故事
Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...
- 设计模式之迭代器模式(Iterator)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- Java设计模式 (1) —— Iterator迭代器模式
拿到这个话题,首先搞清楚:什么是迭代器? 大家都学过 for-i 循环,for-i循环的本质就是 通过i++ 或者 i-- ,以实现 从数据的一端 一个一个地遍历数据元素,直到另一端的最后一个元素,将 ...
- 设计模式(十五):Iterator迭代器模式 -- 行为型模式
1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...
- [导入]C#面向对象设计模式纵横谈(18):(行为型模式) Iterator 迭代器模式.zip(8.04 MB)...
讲座内容: 本培训课程探讨GoF23之 Iterator 迭代器模式的意图.动因.原理.应用场景与C#语言实现,以及该模式在.NET框架程序设计中的具体应用. 课程讲师: 李建忠 上海祝成信息科技有限 ...
- .Net中的设计模式——Iterator模式
在.Net中,我们很少有机会使用Iterator模式,因为.Net Framework已经运用Iterator模式为所有的集合对象实现了迭代器.我们在遍历集合对象时,喜欢使用C#提供的foreach语 ...
- 设计模式复习-迭代器模式
Iterator.H #pragma once #include <list> #include <windows.h> using namespace std;/* 设计模式 ...
- 【GOF23设计模式】迭代器模式
[GOF23设计模式]迭代器模式 来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_迭代器模式.JDK内置迭代器.内部类迭代器 1 package com.test.it ...
- [转载] Python进阶:设计模式之迭代器模式
参考链接: Python中的迭代器 在软件开发领域中,人们经常会用到这一个概念--"设计模式"(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一 ...
最新文章
- linux Shell学习笔记第五天
- HYSBZ - 1026 windy数(数位dp)
- 用 Flink 取代 Spark Streaming,知乎实时数仓架构演进【推荐】
- 基于python的HOG+SVM目标检测算法实现
- [SHOI2008]小约翰的游戏John
- 使用FileSystem类进行文件读写及查看文件信息
- 快速了解Spring Cloud
- matlab 中的矩阵分解
- Jmockit单元测试MockUp调用原始方法
- UVAOJ1586题解
- python中缀表达式转后缀表达式_中缀表达式转换成后缀表达式
- Xcode 9有什么新功能?
- 使用夜神模拟器完美破解(反编译)微信小程序以及问题汇总
- 从行业到技术,10+年资深工程师带你进行嵌入式行业职业规划!
- 快速找出bug的几点建议
- 无锁编程与分布式编程那个更适合多核CPU?
- 圣诞树Easyx绘图
- 前阿里云大数据架构师:想进去阿里云需要掌握什么技能
- kali linux忘记密码找回方法
- 嵌入式笔记-背光控制驱动
热门文章
- 简单搭建zookeeper集群分布式/伪分布式
- [Bzoj2282]消防(二分答案+树的直径)
- 关于云计算 你所知道的可能不是真的
- Git提交时提示‘The file will have its original line endings in your working directory’
- EF架构~在T4模版中为所有属性加默认值
- 如何着手学习一个新的PHP框架
- 如何应用Java的BigDecimal类
- 常用实验资源共享整理 20111026
- 云计算里的安全:警惕云服务被恶意利用
- dubbo 部分 配置的关系-dubbo github 官方案例