分类: 【java】2013-07-15 10:58 917人阅读 评论(0) 收藏 举报
所谓Iterator模式,即是Iterator为不同的容器提供一个统一的访问方式。本文以java中的容器为例,模拟Iterator的原理。
参考:马士兵 Java设计模式 Iterator
1.首先定义一个容器Collection接口.

  1. package com.njupt.zhb.learn.iterator;
  2. public interface Collection {
  3. void add(Object o);
  4. int size();
  5. Iterator iterator();
  6. }

2.定义一个Iterator迭代器的接口

  1. package com.njupt.zhb.learn.iterator;
  2. public interface Iterator {
  3. Object next();
  4. boolean hasNext();
  5. }

3.定义一个ArrayList,实现Collection接口,并写一个实现了Iterator接口的内部类。

  1. package com.njupt.zhb.learn.iterator;
  2. import com.njupt.zhb.learn.iterator.Collection;
  3. public class ArrayList implements Collection {
  4. Object[] objects = new Object[10];
  5. int index = 0;
  6. public void add(Object o) {
  7. if(index == objects.length) {
  8. Object[] newObjects = new Object[objects.length * 2];
  9. System.arraycopy(objects, 0, newObjects, 0, objects.length);
  10. objects = newObjects;
  11. }
  12. objects[index] = o;
  13. index ++;
  14. }
  15. public int size() {
  16. return index;
  17. }
  18. public Iterator iterator() {
  19. return new ArrayListIterator();
  20. }
  21. private class ArrayListIterator implements Iterator {
  22. private int currentIndex = 0;
  23. @Override
  24. public boolean hasNext() {
  25. if(currentIndex >= index) return false;
  26. else return true;
  27. }
  28. @Override
  29. public Object next() {
  30. Object o = objects[currentIndex];
  31. currentIndex ++;
  32. return o;
  33. }
  34. }
  35. }

4.编写测试程序TestMain

  1. package com.njupt.zhb.learn.iterator;
  2. import com.njupt.zhb.learn.iterator.ArrayList;
  3. public class TestMain {
  4. public static void main(String[] args) {
  5. Collection c = new ArrayList();
  6. for(int i=0; i<15; i++) {
  7. c.add("string "+i);
  8. }
  9. System.out.println(c.size());
  10. Iterator it = c.iterator();
  11. while(it.hasNext()) {
  12. Object o = it.next();
  13. System.out.println(o.toString() + " ");
  14. }
  15. }
  16. }

运行结果:

  1. 15
  2. string 0
  3. string 1
  4. string 2
  5. string 3
  6. string 4
  7. string 5
  8. string 6
  9. string 7
  10. string 8
  11. string 9
  12. string 10
  13. string 11
  14. string 12
  15. string 13
  16. string 14

从以上可以看出,设计模式到处用到面向对象中的多态接口调用子类中的函数。源代码下载:
http://download.csdn.net/detail/nuptboyzhb/5755295

Java设计模式之Iterator模式的更多相关文章

  1. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  2. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  3. JAVA设计模式--装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

  4. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  5. 折腾Java设计模式之备忘录模式

    原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's int ...

  6. 折腾Java设计模式之状态模式

    原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...

  7. 折腾Java设计模式之模板方法模式

    博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...

  8. 折腾Java设计模式之访问者模式

    博客原文地址:折腾Java设计模式之访问者模式 访问者模式 Represent an operation to be performed on the elements of an object st ...

  9. 折腾Java设计模式之命令模式

    博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...

随机推荐

  1. ETCD授权认证

    export ETCDCTL_API=3 ENDPOINTS=localhost:2379 etcdctl --endpoints=${ENDPOINTS} role add root etcdctl ...

  2. python合并大量ts文件成mp4格式(ps:上限是450,亲测)

    import os #exec_str = r'copy /b ts/c9645620628078.ts+ts/c9645620628079.ts ts/1.ts' #os.system(exec_s ...

  3. ubuntu 更改pip默认源

    mkdir ~/.pip vim ~/.pip/pip.conf [global] timeout = 6000 https://pypi.tuna.tsinghua.edu.cn/simple 保存 ...

  4. nginx 与上游服务器建立连接的相关设置

    向上游服务建立联系 Syntax: proxy_connect_timeout time; #设置TCP三次握手超时时间,默认60秒:默认超时后报502错误 Default: proxy_connec ...

  5. 牛顿迭代法--求任意数的开n次方

    牛顿迭代法是求开n次方近似解的一种方法,本文参考. 引言 假如\(x^n = m\),我们需要求x的近似值. 我们设\(f(x) = x^n - m\), 那么也就是求该函数f(x)=0时与x轴的交点 ...

  6. 解决安装PyMySQL一直停在Building wheels for collected package:cryptography, cffi, pycparser的问题

    我的运行环境为: 硬件:树莓派3b 系统:ubuntu_meta_16.04.2 因为项目需要,我在树莓派上搭建了基于python编程的Django的web框架,需要从MySQL中读取树莓派以及传感器 ...

  7. 1007 Maximum Subsequence Sum (25分) 求最大连续区间和

    1007 Maximum Subsequence Sum (25分)   Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A ...

  8. luogu P2280 激光炸弹(二维前缀和)

    由题给的xi, yi范围,可以建立二维地图maze[i][j],记录i j范围上的所有目标的价值总和 即有maze[xi][yi] += wi 然后接下来的目标就是求出该二维数组的前缀和 可得到前缀和 ...

  9. ApacheDbUtilsUpdate

    ApacheDbUtilsUpdate package p1; import com.DataSourceUtil; import org.apache.commons.dbutils.QueryRu ...

  10. Languages-used-on-the-Internet

    Languages-used-on-the-Internet 1. 互联网上使用的语言 1.1 网站内容语言 1.2 按语言互联网用户 1.3 维基百科文章统计 2. 综合以上表格数据出图表(2019 ...