分类: 【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. 给服务添加路由--ingress

    kind: NamespaceapiVersion: v1metadata:  name: demo-webshell  generateName: demo-webshell  labels:    ...

  2. tkinter学习(3)scale尺度条和menu菜单

    1.scale学习(尺度条)1.1 代码: #第1步:导出模块 import tkinter as tk #第2步:定义窗口,及其标题.大小和位置 win = tk.Tk() win.title('s ...

  3. Springboot - 更优雅的方式请求发 HTTP 请求

    参考:https://www.cnblogs.com/javazhiyin/p/9851775.html RestTemplate 是 Spring 提供的用于访问Rest 服务的客户端RestTem ...

  4. HDU 1035 Robot Motion(dfs + 模拟)

    嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1035 这道题比较简单,但自己一直被卡,原因就是在读入mp这张字符图的时候用了scanf被卡. ...

  5. JS获取光标在input 或 texterea 中下标位置

    <textarea placeholder="请输入表达式" id="methodInput" ></textarea> 获取位置: v ...

  6. WEB安全 - XSS,CSRF

    1. CSRF参考 https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/ https://en.wikipedia.org/wiki ...

  7. 【PAT甲级】1017 Queueing at Bank (25 分)

    题意: 输入两个正整数N,K(N<=10000,k<=100)分别表示用户的数量以及银行柜台的数量,接下来N行输入一个字符串(格式为HH:MM:SS)和一个正整数,分别表示一位用户到达银行 ...

  8. 小KING教你做android项目(二)---实现登陆页面并跳转和简单的注册页面

    原文:http://blog.csdn.net/jkingcl/article/details/10989773       今天我们主要来介绍登陆页面的实现,主要讲解的就是涉及到的布局,以及简单的跳 ...

  9. 六、linux基础-计算机网络_线程_进程

    6 计算机网络-线程和进程6.1 TCP/IP协议 TCP/IP是Unix/Linux世界的网络基础,在某种意义上,Unix网络就是Tcp/ip,而且Tcp/ip就是网络互连的标准他不是一个独立的协议 ...

  10. Dynamic Programming(动态规划)

    钢材分段问题 #include<iostream> #include<vector> using namespace std; class Solution { public: ...