一.迭代器模式定义
提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示
二.迭代器模式结构说明
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