Iterator模式:提供一个方法按顺序遍历一个集合内的元素,而又不需要暴露该对象的内部表示。
主要实现:
1 .访问一个聚合的对象,而不需要暴露对象的内部表示
2 .支持对聚合对象的多种遍历
3 .对遍历不同的对象,提供统一的接口。
就上代码模拟ArraList和LinkedList的增加方法add(),和迭代Iterator();
首选定义公共接口Collection:
package Iterator;
public interface Collection {
//定义一种约束机制来约束,添加方法就叫ADD(),将对外公开的方法统一起来
void add(Object o);
int size();
Iterator iterator();
}
再定义接口Iterator用于公共迭代入口:
package Iterator;
public interface Iterator {
Object next();
boolean hasNext();
}
然后定义ArraList
package Iterator;
public class ArraList implements Collection{
Object[] objects=new Object[10];
int index=0;
public void add(Object o){
if(index==objects.length){
Object[] newObjects=new Object[objects.length*2];
System.arraycopy(objects, 0, newObjects, 0, objects.length);
objects=newObjects;
}
objects[index]=o;
index++;
}
public int size(){
return index;
}
public Iterator iterator(){
return new ArraListIterator();
}
private class ArraListIterator implements Iterator{
private int currentIndex=0;
@Override
public boolean hasnNext() {
if(currentIndex>=index) return false;
else return true;
}
@Override
public Object next() {
Object o= objects[currentIndex];
currentIndex ++;
return o;
}
}
}
测试类:
package Iterator;
public class ArraListTest {
public static void main(String[] args) {
//ArraList al=new ArraList();
LinkedList al=new LinkedList();
Collection arrl=new ArraList();
Collection link=new LinkedList();
for(int i=0;i<18;i++){
link.add(new Cat(i));
}
System.out.println(link.size());
Iterator it=link.iterator();
while(it.hasnNext()){
Object o=it.next();
System.out.println(o+" ");
}
}
}
package Iterator;
public class Cat {
private int id;
public Cat(int id) {
super();
this.id = id;
}
@Override
public String toString() {
return "Cat [id=" + id + "]";
}
}
LinkedList
package Iterator;
public class LinkedList implements Collection{
Node head=null;
Node tail=null;
//Node data=null;
int size=0;
public void add(Object o){
Node node=new Node(o,null);
if(null==head){
head=node;
tail=node;
}
head=node;
tail.setNext(node);
tail=node;
//tail.setData(node);
size++;
}
public int size(){
return size;
}
@Override
public Iterator iterator() {
return new LinkListIterator();
}
private class LinkListIterator implements Iterator{
private int currentIndex=0;
@Override
public boolean hasnNext() {
if(currentIndex>=size) return false;
else return true;
}
@Override
public Object next() {
/*Object o=tail.getData();
currentIndex ++;
return o;*/
return null;
}
}
提供Node来作为LinkedList指针;
package Iterator;
public class Node {
private Object data;
private Node 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;
}
public Node(Object data, Node next) {
super();
this.data = data;
this.next = next;
}
}
这样,就可以有相同的add(),和迭代方法了;