设计模式之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去实现它就可以了。

 

posted @ 2015-08-23 18:47  陈其苗  阅读(527)  评论(0编辑  收藏  举报