设计模式——迭代器

描述:

迭代器模式提供了一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。 把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,也让任务各得其所。

以下程序模拟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());
			
		}
	}

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值