描述:
迭代器模式提供了一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。 把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,也让任务各得其所。
以下程序模拟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());
}
}
}