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(迭代器)相关推荐

  1. [C# 设计模式] Iterator - 迭代器模式:我与一份奥利奥早餐的故事

    Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...

  2. 设计模式之迭代器模式(Iterator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  3. Java设计模式 (1) —— Iterator迭代器模式

    拿到这个话题,首先搞清楚:什么是迭代器? 大家都学过 for-i 循环,for-i循环的本质就是 通过i++ 或者 i-- ,以实现 从数据的一端 一个一个地遍历数据元素,直到另一端的最后一个元素,将 ...

  4. 设计模式(十五):Iterator迭代器模式 -- 行为型模式

    1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...

  5. [导入]C#面向对象设计模式纵横谈(18):(行为型模式) Iterator 迭代器模式.zip(8.04 MB)...

    讲座内容: 本培训课程探讨GoF23之 Iterator 迭代器模式的意图.动因.原理.应用场景与C#语言实现,以及该模式在.NET框架程序设计中的具体应用. 课程讲师: 李建忠 上海祝成信息科技有限 ...

  6. .Net中的设计模式——Iterator模式

    在.Net中,我们很少有机会使用Iterator模式,因为.Net Framework已经运用Iterator模式为所有的集合对象实现了迭代器.我们在遍历集合对象时,喜欢使用C#提供的foreach语 ...

  7. 设计模式复习-迭代器模式

    Iterator.H #pragma once #include <list> #include <windows.h> using namespace std;/* 设计模式 ...

  8. 【GOF23设计模式】迭代器模式

    [GOF23设计模式]迭代器模式 来源:http://www.bjsxt.com/  一.[GOF23设计模式]_迭代器模式.JDK内置迭代器.内部类迭代器 1 package com.test.it ...

  9. [转载] Python进阶:设计模式之迭代器模式

    参考链接: Python中的迭代器 在软件开发领域中,人们经常会用到这一个概念--"设计模式"(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一 ...

最新文章

  1. linux Shell学习笔记第五天
  2. HYSBZ - 1026 windy数(数位dp)
  3. 用 Flink 取代 Spark Streaming,知乎实时数仓架构演进【推荐】
  4. 基于python的HOG+SVM目标检测算法实现
  5. [SHOI2008]小约翰的游戏John
  6. 使用FileSystem类进行文件读写及查看文件信息
  7. 快速了解Spring Cloud
  8. matlab 中的矩阵分解
  9. Jmockit单元测试MockUp调用原始方法
  10. UVAOJ1586题解
  11. python中缀表达式转后缀表达式_中缀表达式转换成后缀表达式
  12. Xcode 9有什么新功能?
  13. 使用夜神模拟器完美破解(反编译)微信小程序以及问题汇总
  14. 从行业到技术,10+年资深工程师带你进行嵌入式行业职业规划!
  15. 快速找出bug的几点建议
  16. 无锁编程与分布式编程那个更适合多核CPU?
  17. 圣诞树Easyx绘图
  18. 前阿里云大数据架构师:想进去阿里云需要掌握什么技能
  19. kali linux忘记密码找回方法
  20. 嵌入式笔记-背光控制驱动

热门文章

  1. 简单搭建zookeeper集群分布式/伪分布式
  2. [Bzoj2282]消防(二分答案+树的直径)
  3. 关于云计算 你所知道的可能不是真的
  4. Git提交时提示‘The file will have its original line endings in your working directory’
  5. EF架构~在T4模版中为所有属性加默认值
  6. 如何着手学习一个新的PHP框架
  7. 如何应用Java的BigDecimal类
  8. 常用实验资源共享整理 20111026
  9. 云计算里的安全:警惕云服务被恶意利用
  10. dubbo 部分 配置的关系-dubbo github 官方案例