设计模式之Interator模式(1)
interator是java容器遍历的一种手段,当然遍历容易你可以使用普通的for(;;)或者for(Object o : new Arraylist<Object>()),都是可以的。
先来看看JDK容器是怎么实现的吧,首先看看ArrayList,它有海纳百川的肚量,似乎找不到他的边,它可以bigger than bigger,有想过为什么么?
为什么叫ArrayList,不叫DogList,因为ArrayList封装了一个数组,当向这个List中添加东西的时候,其实就是往数组里面加东西,先去判断这个数组是不是已经满了,如果是,就再生成一个更大的数组,把原数组的东西移动到新生成的数组上面,再去添加新的东西。所以,ArrayList肯定性能上比不上Array,因为你每次都要新生成一个新的数组,还需要move,但是人家不需要指定大小,所以还是比较受欢迎一点!
这里我忽略泛型的用法,用code来描述一个简单的ArrayList:
package cn.asto.Interator; public class ArrayList implements List{ private int index = 0; private Object[] object = new Object[10]; public void add(Object o ){ if(index==object.length){ Object[] newObject = new Object[object.length+10]; System.arraycopy(object, 0, newObject, 0, object.length); newObject[index] = o; object = newObject; } object[index]=o; index++; } public int size(){ return index; } @Override public Iterator iterator() { return new arrayIterator(); } private class arrayIterator implements Iterator{ private int currentIndex; @Override public boolean hasNext() { if(currentIndex==index)return false; return true; } @Override public Object next() { Object o = object[currentIndex]; currentIndex++; return o; } } }
不难吧?知道原理的话,看看觉得也就这样子。
来个难点的?LinkedList:
Thinking....
给答案:
Node.java:
package cn.asto.Interator; public class Node { private Node next;//下一个节点的引用 private Object data;//存数据 public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } public Node(Object data,Node next) { super(); this.next = next; this.data = data; } }
LinkedList.java:
package cn.asto.Interator; public class LinkedList { private Node head = null; //头节点 private Node tail = null;//尾节点 private int size = 0; public void add(Object o){ Node n = new Node(o,null); if(head==null){ head = n; tail = n; }else{ tail.setNext(n); tail = n; } size ++; } public int size(){ return size; } }
当然这个集合当然没有JDK所有的方法,我只是简单模拟了一下,为了方便Interator的模式学习。
上面的实现最好可以面向接口去编程,去约束方法名字,变得规范,父类引用子类对象。面向接口编程还有一个好处,可替换性。
比如你可以新建一个List接口:
package cn.asto.Interator; public interface List { public void add(Object o); public int size(); public Iterator iterator(); }
让ArrayList和LinkedList去实现它就可以了。