迭代器模式(Iterator)

来源:互联网 发布:mac口红 百度百科 编辑:程序博客网 时间:2024/06/11 16:55

一.迭代器模式定义

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


二.迭代器模式结构说明

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;}@Overridepublic MyIterator iterator() {return new ArrayListIterator();}//内部类,为了访问当前集合中的数据,迭代器遍历元素使用内部类是最好的实现方式(jdk源码中也使用的是内部类)private class ArrayListIterator implements MyIterator{private int listIndex=0;@Overridepublic boolean hasNext() {if(listIndex<size) return true;else return false;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic MyIterator iterator() {return new LinkedListIterator();}//为了方便访问LinkedList中的数据,写一个遍历的临时内部类private class LinkedListIterator implements MyIterator{private int listIndex=0;private Node tempNode=firstNode;@Overridepublic boolean hasNext() {if(tempNode==null){//第一个为空return false;}else{if(tempNode.getNextNode()!=firstNode) return true;else return false;}}@Overridepublic 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


原创粉丝点击