Java-马士兵设计模式学习笔记-迭代器模式-模仿Collectin ArrayList LinckedList
Java Iterator模式 Java Iterator模式, 模仿Collectin ArrayList LinckedList
一、有如下几个类
1.接口Collection.java
2.接口Iterator.java
3.ArrayList.java
4.LinkedList.java
5.Node.java
关系如下:
代码如下:
1.接口Collection.java
public interface Collection<E> { public void add(E e); public int size(); public Iterator iterator(); }
2.ArrayList.java
public class ArrayList<E> implements Collection<E>{ //先给定一个长度为10的数组 Object [] objects = new Object[10]; //冗余一个int指数,方便判定是组是否为满和返回集合大小 int index = 0; @Override //1.动态添加元素 public void add(E e) { //1.1先判断数组是否已满 if(index == objects.length){ Object [] newObjects = new Object[objects.length*2]; System.arraycopy(objects, 0, newObjects, 0, objects.length); objects = newObjects; //数组是引用数据类型 } //1.2为新添加的元素指定下标 objects[index] = e; //1.3index自加1,以方便返回集合在大小 index++; } //2.根据下标访问元素 @Override //3.返回集合大小 public int size() { return index; } @Override public Iterator iterator() { return new ArrayListIterator(); } private class ArrayListIterator implements Iterator { private int currentIndex = 0; @Override public Object next() { // 返回最下一个元素 Object o = objects[currentIndex]; currentIndex++; return o; } @Override public boolean hasNext() { // 判断是否为最后一个元素 if(currentIndex >= index){ return false; } return true; } } }
3.LinkedList.java
public class LinkedList<E> implements Collection<E> {
private Node head;
private Node tail;
private int size;
public void add(E e){
Node n = new Node(e, null);
if(head == null){
head = n;
tail = n;
size++;
} else {
tail.setNext(n);
tail = n;
size++;
}
}
public int size(){
return size;
}
@Override
public Iterator iterator() {
return new LinkedListIterator();
}
private class LinkedListIterator implements Iterator {
private Node currentNode = head;
@Override
public Object next() {
Object o = currentNode.getData();
currentNode = currentNode.getNext();
return o;
}
@Override
public boolean hasNext() {
if(currentNode.getNext() == null){
return false;
}
return true;
}
}
}
4.Node.java
public class Node { private Object data; private Node next; public Node(Object data, Node next) { super(); this.data = data; this.next = next; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } }
5.Iterator.java
public interface Iterator { public Object next(); public boolean hasNext(); }
6.Dog.java
public class Dog { private int id; public Dog(int id) { super(); this.id = id; } @Override public String toString() { return "Dog"+id; } }
7.测试类CollectionTest.java
public class CollectionTest { @Test public void test() { Collection co = new LinkedList(); for(int i = 0 ;i < 15 ;i++){ co.add(new Dog(i)); } System.out.println(co.size()); Iterator it = co.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } }
运行结果
You can do anything you set your mind to, man!