设为首页收藏本站

IT技术擎 - 最棒的IT web技术交流社区

 找回密码
 注册为IT技术擎人

QQ登录

只需一步,快速开始

搜索
热搜: php h5 jquery
查看: 41|回复: 0

[其他] 设计模式—迭代器Iterator模式

[复制链接]

1万

主题

1万

帖子

4万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
42537
发表于 2018-3-6 15:05:09 | 显示全部楼层 |阅读模式

首先我们先模仿集合中ArrayList和LinkedList的实现。一个是基于数组的实现、一个是基于链表的实现,实现方式各有不同,
为了减少代码的耦合度,面向接口编程。定义Collection接口定义API规范。
可是在遍历集合中的元素时,由于数组和链表的遍历方式不一样,能不能统一处理呢?
再定义一个Iterator接口,让每一个子类集合都实现接口中的方法。
1.接口Collection.java
  1. public interface Collection <E > { public void add(E e); public int size(); public Iterator iterator();
  2. }
复制代码
2.接口Iterator.java
  1. publicinterfaceIterator {publicObject next();publicbooleanhasNext();
  2. }
复制代码

3.实现ArrayList.java
  1. public class ArrayList <E > implements Collection <E >{
  2. //先给定一个长度为10的数组 Object []objects = new Object[10];
  3. //冗余一个int指数,方便判定是组是否为满和返回集合大小 int index = 0;
  4. @Override //1.动态添加元素 public void add(E e) { //1.1先判断数组是否已满 if(index ==objects.length){ Object []newObjects = new Object[objects.length*2]; System.arraycopy(objects, 0, newObjects, 0, objects.length); objects = newObjects;
  5. //数组是引用数据类型 } //1.2为新添加的元素指定下标 objects[index]= e;
  6. //1.3index自加1,以方便返回集合在大小 index++;
  7. }
  8. //2.根据下标访问元素 @Override //3.返回集合大小 public int size() { return index;
  9. }
  10. @Override public Iterator iterator() { return new ArrayListIterator();
  11. } private class ArrayListIterator implements Iterator {
  12. private int currentIndex = 0;
  13. @Override public Object next() { // 返回最下一个元素 Object o = objects[currentIndex]; currentIndex++; return o;
  14. }
  15. @Override public boolean hasNext() { // 判断是否为最后一个元素 if(currentIndex >=index){ return false;
  16. } return true;
  17. } }
  18. }
复制代码
4.Node.java
  1. publicclassNode {privateObject data;privateNode next;publicNode(Object data, Node next) {super();this.data =data;this.next =next; }
  2. publicObject getData() {returndata; }
  3. publicvoidsetData(Object data) {this.data =data; }
  4. publicNode getNext() {returnnext; }
  5. publicvoidsetNext(Node next) {this.next =next; }
  6. }
复制代码
View Code
5.实现LinkedList.java
  1. publicclassLinkedList <e > implementsCollection <e >{
  2. privateNode head;privateNode tail;privateintsize;publicvoidadd(E e){ Node n = newNode(e, null);if(head == null){ head =n; tail =n; size++; }else{ tail.setNext(n); tail =n; size++; } }publicintsize(){returnsize; }
  3. @Override publicIterator iterator() {returnnewLinkedListIterator(); }privateclassLinkedListIterator implementsIterator {
  4. privateNode currentNode =head; @Override publicObject next() { Object o =currentNode.getData(); currentNode =currentNode.getNext();returno; }
  5. @Override publicbooleanhasNext() {if(currentNode.getNext() == null){returnfalse; }returntrue; } }
  6. }
复制代码

在以上的实现可关注:1.ArrayList和LinkedList的不同实现方式
          2.Iterator模式的运用
          3.实现Iterator时内部类的使用
该用户未在地球留下任何的痕迹

本版积分规则

QQ|小黑屋|帮助|IT技术擎 ( 沪ICP备15054863号  

GMT+8, 2018-12-19 05:11

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表