描述:
迭代器模式提供了一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。 把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,也让任务各得其所。
以下程序模拟Java集合中迭代器的实现。
迭代器类图:
由于ArrayList和LinkedList都是集合类型,所以可以抽象出Connection接口,这样在使用到集合的时候就可以创建Connection的引用,而具体的实现是交给具体的集合类去实现。从而实现了多态。同样为了给集合类型提供迭代器,可以抽象出Iterator接口。在Connection接口中创建得到迭代器的方法。
首先创建Iterator接口:
package com.lcq.design; public interface Iterator { boolean hasNext(); Object next(); }
建立Connection接口:
package com.lcq.design; /** * 编写集合的接口 * @author lcq * */ public interface Connection { void add(Object object); int size(); Iterator iterator(); } 编写ArrayList实现类:
package com.lcq.design; /** * 实现自己的ArrayList * * @author lcq * */ public class ArrayList implements Connection { // 设置数组的初始长度为10 Object[] object = new Object[10]; // index为数组当前的下一个为空的元素的位置索引 int index = 0; /** * 创建添加元素的方法 * * @param o */ public void add(Object o) { if (index == object.length) { // 如果添加对象元素时超过了数组的最大值,则新创建一个数组,新创建的数组的长度是旧数组的两倍 Object[] newObjexts = new Object[object.length * 2]; // 将旧数组中数据复制到新数组中 System.arraycopy(object, 0, newObjexts, 0, object.length); // 将新数组的引用传递给旧数组 object = newObjexts; } object[index] = o; index++; } /** * 创建返回集合大小的方法 * * @return */ public int size() { return index; } /** * 创建返回迭代器的方法 */ @Override public Iterator iterator() { return new ArrayListIterator(); } /** * 创建迭代器的内部类 * @author lcq * */ class ArrayListIterator implements Iterator { private int currentIndex = 0; @Override public boolean hasNext() { if (currentIndex >= index) return false; return true; } @Override public Object next() { Object o = object[currentIndex]; currentIndex++; return o; } } }
编写LinkedList的实现类:
package com.lcq.design; /** * 创建LinkedList * * @author lcq * */ public class LinkedList implements Connection { // head标记为链表头 Node head = null; // tail标记为链表尾 Node tail = null; int size = 0; /** * 创建添加节点的方法 * * @param object */ public void add(Object object) { // 实例化一个节点 Node n = new Node(object); // 如果是头节点,则头和尾都指向n if (head == null) { head = n; tail = n; } // 尾巴向后移动 tail.setNext(n); tail = n; size++; } /** * 创建返回链表长度的方法 * * @return */ public int size() { return size; } @Override public Iterator iterator() { return new LinkedListIterator(); } class LinkedListIterator implements Iterator { private int currentIndex = 0; @Override public boolean hasNext() { if (currentIndex >= size) return false; else return true; } @Override public Object next() { if (currentIndex == 0) { currentIndex++; return head.getData(); } else { currentIndex++; head = head.getNext(); return head.getData(); } } } } /** * 创建节点类 * @author lcq * */ class Node { public Node(Object data) { this.data = data; } //data记录数据值 private Object data; //next记录下一个节点的引用 private Node 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; } }
为了测试方便,编写一个Cat类:
package com.lcq.design; public class Cat { private int id; public Cat(int id){ this.id = id; } @Override public String toString() { return "cat :" + id; } } 最后是测试类:
package com.lcq.design; public class Test { /** * @param args */ public static void main(String[] args) { System.out.println("-------ArrayList-----------"); ArrayList a = new ArrayList(); for (int i = 0; i < 15; i++) { a.add(new Cat(i)); } System.out.println(a.size()); System.out.println("-------LinkedList-----------"); LinkedList list = new LinkedList(); for (int i = 0; i < 15; i++) { list.add(new Object()); } System.out.println(list.size()); System.out.println("------Connection------------------"); Connection c = new LinkedList(); for (int i = 0; i < 15; i++) { c.add(new Cat(i)); } System.out.println(c.size()); System.out.println("-----------ArrayListIterator---------------"); Iterator iterator = a.iterator(); while(iterator.hasNext()){ Object o = iterator.next(); System.out.println(o.toString()); } System.out.println("-----------LinkedListIterator---------------"); Iterator iterator2 = c.iterator(); while(iterator2.hasNext()){ Object o = iterator2.next(); System.out.println(o.toString()); } } }