设计模式(8) - 迭代器模式(iterator)- 实现ArrayList和linkedList的迭代器

来源:互联网 发布:上海淘宝运营培训班 编辑:程序博客网 时间:2024/06/05 05:35

上周六就开始写这篇博客,之后一直耽误了,到前天才开始写,今天醒的早,就把这部分整理一下。本文内容参考易学设计模式和马士兵的迭代器模式的视频。

了解迭代器模式一个作用就是让你在使用 迭代器遍历集合类的时候 觉得更自然。'


一 、迭代器模式简介

【定义】 跌倒器模式提供一种顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示的方法。

【原理】 主要4部分组成:迭代器角色、具体迭代器角色、容器角色和具体容器角色。

【使用时机】当访问一个聚合对象的内容而无需暴露它的内部表示,或者需要支持对集合对象的多种遍历,或者为

遍历不同的聚合结构提供一个统一的接口时,就可以考虑是用迭代器模式。

二 、实现ArrayList和linkedList的迭代器

这里只是简单实现,具体的可以看看源码。记得csdn中有一个 兰亭风雨 的博客写有集合类源码解析的文章。

上代码:

Iterator.java

package com.chan;public interface Iterator {Object next();boolean hasNext();}

Collection.java

package com.chan;public interface Collection {void add(Object obj);int size();Iterator iterator();}

Node,java

package com.chan;public class Node {private Object data;private Node next;public Node(Object data, Node next) {super();this.data = data;this.next = next;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public Node getNext() {return next;}public void setNext(Node next) {this.next = next;}}

ArrayList.java

package com.chan;public class ArrayList implements Collection {Object[] objects = new Object[10];int index = 0;public void add(Object o) {if(index == objects.length) {Object[] newObjects = new Object[objects.length * 2];System.arraycopy(objects, 0, newObjects, 0, objects.length);objects = newObjects;}objects[index] = o;index ++;}public int size() {return index;}public Iterator iterator() {return new ArrayListIterator();}private class ArrayListIterator implements Iterator {private int currentIndex = 0;@Overridepublic boolean hasNext() {if(currentIndex >= index) return false;else return true;}@Overridepublic Object next() {Object o = objects[currentIndex];currentIndex ++;return o;}}}

LinkedList.java

package com.chan;public class LinkedList implements Collection {Node head = null;Node tail = null;int size = 0;public void add(Object o) {Node n = new Node(o, null);if(head == null) {head = n;tail = n;}tail.setNext(n);tail = n;size ++;}public int size() {return size;}@Overridepublic Iterator iterator() {return new LinkedListIterator();}private class LinkedListIterator implements Iterator{private Node currentNode = head;private int nextIndex = 0;//参考源码中的写法@Overridepublic Object next() {Object data = currentNode.getData();currentNode = currentNode.getNext();nextIndex ++;return data;}@Overridepublic boolean hasNext() {return nextIndex != size;}}}

Test>java

package com.chan;public class Test {public static void main(String[] args) {//Collection c = new ArrayList();Collection c = new LinkedList();for(int i=0; i<15; i++){c.add("test-"+i);}System.out.println(c.size());Iterator it = c.iterator();while(it.hasNext()) {Object o = it.next();System.out.print(o + " ");}}//15//test-0 test-1 test-2 test-3 test-4 test-5 test-6 test-7 test-8 test-9 test-10 test-11 test-12 test-13 test-14 }


以上代码测试通过。
 

9 0
原创粉丝点击