一、有如下几个类
1.接口Collection.java
2.接口Iterator.java
3.ArrayList.java
4.LinkedList.java
5.Node.java
应用实例:JAVA中的iterator
优点:1、它支持以不同的方式遍历一个聚合对象。2、迭代器简化了聚合类。3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
使用场景:1、访问一个聚合对象的内容而无须暴露它的内部表示。
2、需要为聚合对象提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口
package com.bjsxt.dp.iterator;
public interface Collection {
void add(Object o);
int size();
Iterator iterator();
}
package com.bjsxt.dp.iterator;
public interface Iterator {
Object next();
boolean hasNext();
}
package com.bjsxt.dp.iterator;
public class Cat {
public Cat(int id) {
super();
this.id = id;
}
private int id;
@Override
public String toString() {
return "cat:" + id;
}
}
- ArrayList
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; } } }
- LinkedList
</pre><pre name="code" class="java">package com.bjsxt.dp.iterator; import com.bjsxt.dp.iterator.Collection; public class LinkedList implements Collection { Node head = null; Node tail = null; int size = 0; public void add(Object o) { Node n = new Node(o, null); if(head == null) { //头结点 head = n; tail = n; } tail.setNext(n);//不为空时,指定下一个结点 tail = n; size ++; } public int size() { return size; } @Override public Iterator iterator() { return null; } }
package com.bjsxt.dp.iterator; import com.bjsxt.dp.iterator.ArrayList; import com.bjsxt.dp.iterator.LinkedList; public class Test { public static void main(String[] args) { //ArrayList al = new ArrayList(); //LinkedList al = new LinkedList(); Collection c = new ArrayList(); for(int i=0; i<15; i++) { c.add(new Cat(i)); } System.out.println(c.size()); Iterator it = c.iterator(); while(it.hasNext()) { Object o = it.next(); System.out.print(o + " "); } } }