现在的位置: 首页 > 综合 > 正文

迭代器模式(Iterator)

2017年04月14日 ⁄ 综合 ⁄ 共 4402字 ⁄ 字号 评论关闭

一.迭代器模式定义

提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示

二.迭代器模式结构说明

1.Iterator:迭代器接口。定义访问和遍历元素的统一接口。

2.ConcreteIterator:具体的迭代器实现对象。实现对聚合对象的遍历,并跟踪当前位置。

3.Collection:集合。迭代器的遍历目标。

4.ConcreteCollection:具体的集合对象。

三.迭代器模式示例代码

package com.exercise.util;

import com.exercise.util.Collection;

//提供一种统一的接口,所有需要遍历的容器必须实现这两个方法
public interface MyIterator {
	boolean hasNext();
	Object next();
}
package com.exercise.util;

//集合
public interface Collection {
	void add(Object obj);
	int size();
	MyIterator iterator();
	
}

四.简单模拟jdk迭代器模式遍历

/**
 * @function 写一个自己的collections,能够往里面添加东西
 * 
 */
package com.exercise.util;

import com.exercise.util.Collection;
public class MyArrayList implements Collection{
	private int size=10;
	
	private Object [] array=null;
	
	public MyArrayList(){
		array=new Object[2];//可以容纳两个元素
	}
	
	public void add(Object obj){
		array[size]=obj;
		size++;
		Object [] tempArray=new Object[getTempSize()];
//		System.out.println("临时大小:"+getTempSize());
		//将原来的数据复制到这个新的数组中
		copy(tempArray,array);
		array=tempArray;
	}
	
	//将老数组里面的东西copy到新数组里面去
	private void copy(Object[] newArray, Object[] oldArray) {
		for(int i=0;i<oldArray.length;i++){
			if(oldArray[i]!=null){
				newArray[i]=oldArray[i];				
			}
		}
	}
	
	//打印数组
	public void show(){
		for(int i=0;i<array.length;i++){
			if(array[i]!=null){
				System.out.print(array[i].toString()+"\t");				
			}
		}
		System.out.println ();
	}
	//数组大小
	public int size(){
		return size;
	}
	private int getTempSize(){
		return size+10;
	}

	@Override
	public MyIterator iterator() {
		return new ArrayListIterator();
	}

	//内部类,为了访问当前集合中的数据,迭代器遍历元素使用内部类是最好的实现方式(jdk源码中也使用的是内部类)
	private class ArrayListIterator implements MyIterator{
		private int listIndex=0;
		
		@Override
		public boolean hasNext() {
			if(listIndex<size) return true;
			else return false;
		}

		@Override
		public Object next() {
			Object obj=array[listIndex];
			listIndex++;
			return obj;
		}

	}
}
package com.exercise.util;

//节点
public class Node {
	private Object element=null;
	private Node nextNode=null;
	
	public Object getElement() {
		return element;
	}
	public void setElement(Object element) {
		this.element = element;
	}
	public Node getNextNode() {
		return nextNode;
	}
	public void setNextNode(Node nextNode) {
		this.nextNode = nextNode;
	}
	
	@Override
	public String toString(){
		return this.getElement().toString();
	}
	
}
package com.exercise.util;

import com.exercise.util.Collection;
public class MyLinkedList implements Collection{
	private int size=0;
	
	private Node[] nodeList=null;
	//第一个元素
	private Node firstNode=null;
	
	public MyLinkedList(){
		nodeList=new Node[10];
	}
	
	public void add(Object obj){
		if(obj==null){
			try {
				throw new Exception("添加的元素不能为空!");
			} catch (Exception e) {
				e.printStackTrace();
			}
			return ;
		}
		//如果容量不够了
		if(size==nodeList.length){
			Node []tempNodeList=new Node[getIncreasedSize()];
			System.arraycopy(nodeList, 0, tempNodeList, 0, nodeList.length);			
			nodeList=tempNodeList;
		}
		//开始添加节点了
		Node tempNode=new Node();
		if(size==0){//第一个元素
			firstNode=tempNode;
			tempNode.setElement(obj);
			tempNode.setNextNode(firstNode);
			nodeList[size]=firstNode;
		}else{
			nodeList[size-1].setNextNode(tempNode);
			tempNode.setElement(obj);
			tempNode.setNextNode(firstNode);
			nodeList[size]=tempNode;
		}		
	    size++;
	}
	
	private int getIncreasedSize(){
		return size+10;
	}
	//遍历元素
	public void show(){
		if(size==1){
			System.out.println(firstNode.getElement());
		}else{
			System.out.print(firstNode.getElement()+"\t");
			Node node=firstNode.getNextNode();
			while(node!=firstNode){
				System.out.print(node.getElement()+"\t");
				node=node.getNextNode();
			}
		}
		System.out.println();
	}

	public int size() {
		return size;
	}

	@Override
	public MyIterator iterator() {
		return new LinkedListIterator();
	}
	
	//为了方便访问LinkedList中的数据,写一个遍历的临时内部类
	private class LinkedListIterator implements MyIterator{
		private int listIndex=0;
		private Node tempNode=firstNode;
		
		@Override
		public boolean hasNext() {
			if(tempNode==null){//第一个为空
				return false;
			}else{
				if(tempNode.getNextNode()!=firstNode) return true;
				else return false;
			}
		}

		@Override
		public Object next() {
			if(listIndex==0){
				listIndex++;
				return tempNode;
			}else{
				tempNode=tempNode.getNextNode();
				listIndex++;
				return tempNode;
			}
		}
		
	}	

}
package com.exercise.test;

import com.exercise.util.MyArrayList;
import com.exercise.util.MyIterator;
import com.exercise.util.MyLinkedList;
import com.exercise.util.Node;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
//		MyArrayList arr=new MyArrayList();
//		arr.add("hello");
//		arr.add("world");
//		arr.add("你好");
//		arr.add("你好");
//		arr.add("!!!");
//		arr.show();
//		System.out.println("数组大小:"+arr.size());
		
		MyLinkedList arr=new MyLinkedList();
		for(int i=0;i<6;i++){
			arr.add("Hello");
			arr.add("World");			
		}
//		arr.show();
		System.out.println("链表大小:"+arr.size());
		
		//统一遍历接口
		MyIterator iter=arr.iterator();
		while(iter.hasNext()){
			System.out.print(iter.next()+"\t");
		}
	}

}

输出结果:
1.MyArrayList类测试结果:数组大小:5     helloworld你好你好 !!!
2.MyLinkedList类测试结果:链表大小:12    HelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorld

抱歉!评论已关闭.